Путаница в поведении свойств переднего плана - PullRequest
3 голосов
/ 26 июля 2011

У меня есть пользовательский элемент управления, подобный этому:

    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>

, если я его запусту, это будет выглядеть так:

enter image description here

Так что я путаюсь с тем, что TextBlock в ControlTemplate следует локальномуЗначение переднего плана.Но TextBlock, добавленный в метод OnApplyTemplate, следует за значением из стиля.

Но я хочу, чтобы TextBlock следовал стилю только при отсутствии локального значения.

Так почему жедва TextBlocks ведут себя по-разному, и как я могу получить TextBlock, который следует только стилю, когда нет локального значения?

Примечание. Как сделать так, чтобы TextBlocks внутри пользовательского элемента управления не подвергался влиянию неявногостиль в ресурсах сетки (который содержит пользовательский элемент управления).

1 Ответ

2 голосов
/ 27 июля 2011

Когда вы применяете локальное значение для Foreground, вы применяете к CustomControl, тогда как в стиле вы применяете только к TextBlock, что имеет большое значение. Избавьтесь от Grid.Resources и переместите ваш установщик стиля непосредственно в ControlTemplate, и он будет работать как положено.

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Foreground" Value="Green"></Setter>
    <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>
...