У меня есть пользовательский элемент управления, подобный этому:
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>
, если я его запусту, это будет выглядеть так:
Так что я путаюсь с тем, что TextBlock в ControlTemplate следует локальномуЗначение переднего плана.Но TextBlock, добавленный в метод OnApplyTemplate, следует за значением из стиля.
Но я хочу, чтобы TextBlock следовал стилю только при отсутствии локального значения.
Так почему жедва TextBlocks ведут себя по-разному, и как я могу получить TextBlock, который следует только стилю, когда нет локального значения?
Примечание. Как сделать так, чтобы TextBlocks внутри пользовательского элемента управления не подвергался влиянию неявногостиль в ресурсах сетки (который содержит пользовательский элемент управления).