9

次のように、ボタン用に独自の ControlTemplate を作成しました。

<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>

さて、ボタンにマージンを設定すると、次のようになります。

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

ボタンには実際には 2 倍の Margin - 40 があります。実際、コントロールは Margin を使用してはならず、Margin プロパティは配置フェーズ中にボタンの祖先によってのみ読み取られると想定しました。その後、WPF のデフォルト スタイルを調べたところ、いずれも Margin を使用していないことがわかりました。

これは正しい結論ですか (Margin はコンテナーによって正しく配置されるためだけに制御されているということです)? つまり、スタイルで {TemplateBinding Margin} を使用するたびに、代わりに 2 つのマージンが得られるのでしょうか。そして、私のコントロールが使用すべきではない同様のプロパティのリストはありますか (それらは「周囲の世界」のみを対象としているため)?

これについて説明している MSDN ページを教えてください。ありがとうございました!

編集:

http://msdn.microsoft.com/en-us/library/ms745058.aspxhttp://msdn.microsoft.com/en-us/library/ms751709.aspxで答えを見つけるべきだと思いますが、私はしませんMargin プロパティを使用するのは決してコントロールではなく、それを評価してレイアウトに影響を与えるのは常に祖先または wpf システムであると明示的に述べたとは思わない...

4

2 に答える 2

5

マージンはレイアウト システムによって自動的に適用されます。コントロール テンプレート内では、代わりに Padding を使用する必要があります。

<Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... />
于 2010-01-05T17:21:14.497 に答える