WPF:哪些属性应用于ControlTemplate

时间:2015-02-19 09:36:10

标签: c# wpf xaml binding controltemplate

我想了解xaml Control的哪些属性应用于该Control的ControlTemplate。
F.E.如果我基于Window类创建一个Control,如下所示:
(这是非常简化的 - 在我所知的当前状态下没有意义......)

public class BaseWindow : Window {
   public BaseWindow() { }
}

模板:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
                    xmlns:local="clr-namespace:Arctic">



    <Style TargetType="{x:Type local:BaseWindow}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:BaseWindow}">



                    <Grid Background="Transparent">
                        <Border Background="{TemplateBinding Background}"/>
                        <ContentPresenter/>
                    </Grid>



                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

现在,当我在我的应用程序中指定BaseWindow控件时,Margin属性将应用于BaseWindow而不指定TemplateBinding。背景不是,我必须在模板中声明TemplateBinding才能实现这一点。
你能解释一下为什么默认情况下某些属性应用于ControlTemplate而其他属性不是?

我的猜测是,Window.xaml(WPF的默认窗口模板)绑定到某些属性(如Margin)但忽略了一些像Background。如果这是真的,那么我不明白为什么我可以在窗口控件中设置背景并将其应用于它。看起来像Window绑定到某些属性,并在你从中派生时停止这样做...
这可能是完全错误的 - 我只是想解释一下我的想法。

1 个答案:

答案 0 :(得分:0)

Window类继承FrameworkElement及其所有属性,包括FrameworkElement.Margin。同样适用于Control.Background。您的问题是为什么您需要做一些让Control.Background工作的事情。

答案很简单:

  • Margin用于布局,其功能由FrameworkElement实施/提供,并且始终为您隐身,无视ControlTemplate(因为全部框架元素参与布局和使用边距。)

  • 反过来,
  • Background提供给视觉用户使用。这取决于你如何使用它,因为只有你知道控件的外观。 Control不知道如何处理该财产。

因此,您必须使用TemplateBindingBackground绑定到ControlTemplate中的某种颜色,但Margin无需在控制模板中执行任何操作。