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.Margin
。 Control.Background
也是如此。你的问题是为什么你必须做一些事情才能让 Control.Background
工作。
答案很简单:
Margin
用于布局,它的功能是 FrameworkElement
implemented/provided 并且它总是发生,对你不可见并且无视 ControlTemplate
(因为全部框架元素参与布局,使用margin)
Background
又提供给视觉对象使用。如何使用它取决于您,因为只有您知道控件的外观。 Control
不知道如何处理 属性.
因此,您必须使用 TemplateBinding
将 Background
绑定到 ControlTemplate
中的某些颜色,但是 Margin
无需在控件模板中执行任何操作即可工作。
我想了解 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.Margin
。 Control.Background
也是如此。你的问题是为什么你必须做一些事情才能让 Control.Background
工作。
答案很简单:
Margin
用于布局,它的功能是FrameworkElement
implemented/provided 并且它总是发生,对你不可见并且无视ControlTemplate
(因为全部框架元素参与布局,使用margin)Background
又提供给视觉对象使用。如何使用它取决于您,因为只有您知道控件的外观。Control
不知道如何处理 属性.
因此,您必须使用 TemplateBinding
将 Background
绑定到 ControlTemplate
中的某些颜色,但是 Margin
无需在控件模板中执行任何操作即可工作。