XAML样式仅在使用MergedDictionaries时在第二个实例之后应用

时间:2016-10-03 11:52:35

标签: c# wpf xaml

我观察到,在MergedDictionaries标记内定义自定义按钮样式时,样式仅应用于控件的第二个(以及所有其他实例)实例。 当我省略MergedDictionaries并继续ResourceDictionary标记时,就不会发生这种情况。

奇怪的是,Visual Studio(2015)设计师展示了我的预期外观 - 它只是在运行时才发生错误。

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <Style x:Key="mybutton" TargetType="{x:Type Button}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Border  BorderBrush="Red" BorderThickness="1" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                    <Style BasedOn="{StaticResource mybutton}" TargetType="{x:Type Button}" />
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <StackPanel>
        <Button Height="100" />
        <Button Height="50" />
    </StackPanel>
</Window>

请注意,这是一个完全空白的模板,而不是上面的XAML:

enter image description here

1 个答案:

答案 0 :(得分:1)

根据此链接,您没有使用MergedDictionaries: https://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.mergeddictionaries.aspx?f=255&MSPPError=-2147217396

“通过向MergedDictionaries引用的泛型集合添加ResourceDictionary来合并字典。合并的ResourceDictionary在标记中没有在其中定义的资源元素。相反,合并的字典是没有定义标记子元素的ResourceDictionary(或者没有通过代码添加的元素),但是为Source指定了一个URI。“

您可以轻松编写如下样式:

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Window.Resources>
        <Style x:Key="mybutton" TargetType="{x:Type Button}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border  BorderBrush="Red" BorderThickness="1" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style BasedOn="{StaticResource mybutton}" TargetType="{x:Type Button}" />
    </Window.Resources>
    <StackPanel>
        <Button Height="100" />
        <Button Height="50" />
    </StackPanel>
</Window>