WPF:哪些属性应用于 ControlTemplate

WPF: Which properties are applied to the ControlTemplate

我想了解 xaml 控件的哪些属性应用于该控件的 ControlTemplate。
F.e。如果我创建一个基于 Window Class 的控件,如下所示:
(这很简单——在我知道的当前状态下没有意义……)

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 的默认 Window 模板)绑定到某些属性,例如边距,但忽略了某些属性,例如背景。如果这是真的,那么我不明白为什么我可以在 Window 控件中设置背景并将其应用于它。似乎 Window 绑定到某些属性并在您从中派生时停止这样做……
这可能是完全错误的——我只是想解释一下我的想法。

Window class 继承 FrameworkElement 及其所有属性,包括 FrameworkElement.MarginControl.Background 也是如此。你的问题是为什么你必须做一些事情才能让 Control.Background 工作。

答案很简单:

  • Margin 用于布局,它的功能是 FrameworkElement implemented/provided 并且它总是发生,对你不可见并且无视 ControlTemplate (因为全部框架元素参与布局,使用margin)

  • Background 又提供给视觉对象使用。如何使用它取决于您,因为只有您知道控件的外观。 Control 不知道如何处理 属性.

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