は、私はこのようなカスタムコントロールを持っている:Foregroundプロパティ行動の混乱
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
だから私の混乱がControlTemplateの中のTextBlockは、フォアグラウンドのローカル値を以下のことです:私は、それはこのようになるだろう、それを実行します。しかし、OnApplyTemplateメソッドに追加されたTextBlockはスタイルの値に従います。
しかし、私がしたいのは、ローカル値が存在しない場合にのみスタイルに従うTextBlockです。
なぜ、2つのTextBlocksの動作が異なっているのですか?また、ローカル値が存在しない場合にのみスタイルに従うTextBlockを取得するにはどうすればよいですか?
注:どのように私は ( は、カスタムコントロールを含む)グリッドのリソースの暗黙的なスタイルの影響を受けていないカスタムコントロールの内部のテキストブロックを作ることができます。
ありがとう、これは問題を解決する1つの方法です。しかし、私はローカル値が存在しないときにスタイル(Grid.Resourcesで定義されている)に従うだけのカスタムコントロールを取得したかったのです。 – CuiPengFei
'Grid.Resources'のあなたのスタイルは、' TextControl1'のもので 'TextBlock'のものではありません。 "' – anivas
本当にありがとうございます。異なって振る舞う。私は、テキストブロックのスタイルが存在するときに中断されないカスタムコントロールが必要です。 – CuiPengFei