如何在不会​​被较低级别样式覆盖的样式中应用设置

时间:2016-08-22 17:09:29

标签: c# wpf xaml

我有一个相当复杂的应用程序,我有一个简单的附加行为,我想在我的所有TextBox上设置。

当我直接在元素上设置时,附加行为正常工作:

<TextBox 
    Text="{KtWpf:OrdinaryBinding Path=contact}" 
    utilityClasses:TextBoxBehavior.SelectAllTextOnFocus="True"
    />

当我在包含TextBox的元素的资源中通过未命名的样式设置它时,它工作正常:

<Grid>
    <Grid.Resources>
        <Style TargetType="TextBox">
            <Setter
                Property="utilityClasses:TextBoxBehavior.SelectAllTextOnFocus"
                Value="True" />
        </Style>
    </Grid.Resources>

    [...]

但是如果我在更高级别的资源中通过未命名的样式应用它,它就不适用于在较低级别资源中具有未命名样式的元素:

<KtWpf:KorUserControl>
    <KtWpf:KorUserControl.Resources>
        <Style TargetType="TextBox">
            <Setter
                Property="utilityClasses:TextBoxBehavior.SelectAllTextOnFocus"
                Value="True" />
        </Style>

        <Grid>
            <Grid.Resources>
                <Style TargetType="TextBox">
                    <Setter Property="Width" Value="200" />
                </Style>
            </Grid.Resources>

            [...]

            <TextBox 
                Text="{KtWpf:OrdinaryBinding Path=contact}" 
                />

我期待两种行为中的一种:

  1. WPF将使用TargetType =“TextBox”搜索所有未命名的样式,从最外层开始,依次应用每个设置,或者使用内部样式的设置覆盖外部样式的设置,或者
  2. WPF会从TextBox元素向外搜索,直到找到最适合的内部样式,然后使用它,忽略所有其他样式。
  3. 从我在测试中发现的,WPF正在做第二个。在这种情况下,我想要的是第一个。

    如何在全局应用的样式中定义设置,即使TargetType上有未命名的样式在较低级别定义?

1 个答案:

答案 0 :(得分:0)

我认为你做不到。较低级别的通用样式将始终覆盖较高级别的通用样式。我不认为有“多种风格”元素。

但是,您可以命名更高级别的样式(使其成为非泛型样式),并在较低级别的通用样式中使用BasedOn =“{StaticResource baseStyle}”。

只是我的意见obv。