3
我有一個這樣的自定義控件:前景財產行爲混亂
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>
if我運行它,它會是這樣的:
所以我的困惑是,在控件模板中的TextBlock如下前景的局部值。但在OnApplyTemplate方法中添加的TextBlock遵循樣式中的值。
但我想要的是一個TextBlock,只有當沒有本地值存在時才遵循樣式。
那麼,爲什麼兩個TextBlocks的行爲不同,我怎樣才能得到一個TextBlock,只有在沒有本地值的情況下才符合樣式?
注:我怎樣才能使電網的資源(其中 包含自定義控制)受隱式風格的自定義控制不 的內部的TextBlocks。
謝謝,這是解決問題的一種方法。但是我想在不存在本地值的情況下獲得只遵循樣式(在Grid.Resources中定義)的自定義控件。 – CuiPengFei
然後你在'Grid.Resources'中的風格應該是'CustomControl1'而不是'TextBlock'。 '' – anivas
'謝謝,但我真正的問題是,我想知道爲什麼兩個TextBlocks行爲有所不同。我想要一個自定義控件,當文本塊的樣式出現時不會被打斷。 – CuiPengFei