我想了解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绑定到某些属性,并在你从中派生时停止这样做...
这可能是完全错误的 - 我只是想解释一下我的想法。
答案 0 :(得分:0)
Window
类继承FrameworkElement
及其所有属性,包括FrameworkElement.Margin
。同样适用于Control.Background
。您的问题是为什么您需要做一些让Control.Background
工作的事情。
答案很简单:
Margin
用于布局,其功能由FrameworkElement
实施/提供,并且始终为您隐身,无视ControlTemplate
(因为全部框架元素参与布局和使用边距。)
Background
提供给视觉用户使用。这取决于你如何使用它,因为只有你知道控件的外观。 Control
不知道如何处理该财产。
因此,您必须使用TemplateBinding
将Background
绑定到ControlTemplate
中的某种颜色,但Margin
无需在控制模板中执行任何操作。