【发布时间】:2011-07-26 19:34:07
【问题描述】:
我有一个这样的自定义控件:
public class CustomControl1 : Control
{
private StackPanel panel;
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
public override void OnApplyTemplate()
{
panel = (StackPanel)GetTemplateChild("root");
panel.Children.Add(new TextBlock { Text = "TextBlock added in the OnApplyTemplate method" });
base.OnApplyTemplate();
}
}
它的控件模板是这样的:
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<StackPanel Name="root">
<TextBlock>TextBlock added in ControlTemplate</TextBlock>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然后我在主窗口中使用它:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:app1="clr-namespace:WpfApplication1">
<Grid>
<Grid.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"></Setter>
</Style>
</Grid.Resources>
<app1:CustomControl1 Foreground="Red">
</app1:CustomControl1>
</Grid>
如果我运行它,它会是这样的:
所以我的困惑是 ControlTemplate 中的 TextBlock 遵循 Foreground 的本地值。但是在 OnApplyTemplate 方法中添加的 TextBlock 遵循样式中的值。
但我想要的是一个仅在没有本地值存在时才遵循样式的 TextBlock。
那么为什么这两个 TextBlock 的行为不同,我如何才能获得一个仅在没有本地值存在时才遵循样式的 TextBlock?
注意:如何使自定义控件内的 TextBlocks 不 受网格资源中隐式样式的影响(其中 包含自定义控件)。
【问题讨论】:
标签: .net wpf xaml custom-controls controltemplate