WPF:Warum sollte ich {TemplateBinding Margin} nicht in ControlTemplate verwenden? Ist Margin nur für Elementcontainer gedacht?

StackOverflow https://stackoverflow.com/questions/2006872

Frage

Ich habe mein eigenes ControlTemplate für Button erstellt, etwa so:

<Style x:Key="LightButtonStyle" TargetType="{x:Type ButtonBase}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ButtonBase}">
                <Border
                    x:Name="WrappingBorder"
                    Margin="{TemplateBinding Margin}"
                    ...
                    >
                    <ContentPresenter 
                        Content="{TemplateBinding Content}" 
                        ...
                        >
                    </ContentPresenter>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Jetzt ist mir Folgendes aufgefallen, wenn ich den Rand für meine Schaltfläche festgelegt habe:

<Button 
    Style="{StaticResource LightButtonStyle}"
    Margin="20"
    >
    Hello world!
</Button>

Die Schaltfläche hat tatsächlich den doppelten Rand – 40.Ich ging davon aus, dass das Steuerelement tatsächlich niemals Margin verwenden sollte und dass die Margin-Eigenschaft während der Anordnungsphase nur von den Vorfahren der Schaltfläche gelesen wird.Ich habe mir dann die WPF-Standardstile angesehen und herausgefunden, dass keiner von ihnen Margin verwendet hat.

Ist das die richtige Schlussfolgerung (dass Margin nur die Kontrolle über die korrekte Anordnung der Container hat)?Mit anderen Worten: Jedes Mal, wenn ich {TemplateBinding Margin} in meinem Stil verwende, erhalte ich stattdessen doppelte Ränder? Und gibt es eine Liste ähnlicher Eigenschaften, die mein Steuerelement nicht verwenden sollte (da sie nur für die „umliegende Welt“ gedacht sind)?

Würden Sie mich auf die MSDN-Seite verweisen, die dies erklärt?Danke schön!

BEARBEITEN:

Ich schätze, ich sollte Antworten in finden http://msdn.microsoft.com/en-us/library/ms745058.aspx Und http://msdn.microsoft.com/en-us/library/ms751709.aspx, aber ich glaube nicht, dass sie dies ausdrücklich erwähnt haben niemals das Steuerelement, das die Margin-Eigenschaft verwendet stets der Vorfahre oder das WPF-System, das es auswertet und es verwendet, um das Layout zu beeinflussen ...

War es hilfreich?

Lösung

Ihre Schlussfolgerung ist richtig. Wenn Sie sich die vom Framework bereitgestellten Standardvorlagen ansehen, werden Sie feststellen, dass die Margin innerhalb der Vorlage ist an die gebunden Padding Eigentum der Kontrolle.

Andere Tipps

Der Rand wird vom Layoutsystem automatisch angewendet. Innerhalb einer Steuerelementvorlage sollten Sie stattdessen Padding verwenden.

<Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top