类型的Xaml默认样式

时间:2016-06-14 12:37:31

标签: wpf xaml

我为我的应用程序中的所有图像设置了图像的默认样式(放入应用程序资源中):

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

        <Setter Property="Opacity" Value="0.3"/> <!--To obviously see that it works-->
        <Setter Property="RenderOptions.BitmapScalingMode" Value="HighQuality" />
        <Setter Property="SnapsToDevicePixels" Value="True" />
    </Style>
</ResourceDictionary>

如果我在其他地方有一个像

这样的风格的图像
<Image>
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            ... set some other properties here
        </Style>
    </Image.Style>
</Image>

未应用基本样式。如果我放一个

BasedOn="{StaticResource {x:Type Image}}"

一切都符合(I)预期。

有没有办法在不经过我所有的xaml的情况下应用默认样式并将BasedOn添加到每个样式化的图像?

修改

我经常会有某种DataTriggers:

<Image>
    <Image.Style>
        <Style TargetType="{x:Type Image}" >
            <Style.Triggers>
                <DataTrigger Binding="{Binding Type}" Value="VAR1">
                    <Setter Property="Source" Value="/MyApp;component/Resources/Var1.png"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Type}" Value="VAR2">
                    <Setter Property="Source" Value="/MyApp;component/Resources/Var2.png"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

1 个答案:

答案 0 :(得分:0)

因此,通过声明新样式,您可以有效地覆盖默认样式。 BasedOn是从另一个样式模板继承元素所必需的(在这种情况下是默认值),所以你看到的是预期的结果。

但是,您可以放弃其他模板,只需在实例级别声明属性,这样就不需要引用其他模板了。

所以不要像现在这样使用新模板;

<Image>
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            ... set some other properties here
        </Style>
    </Image.Style>
</Image>

您只需插入属性,如

<Image Property="Value" Property="Value" Property="Value"/>

然后Image仍将继承默认值,但只会在实例而不是整个模板中覆盖特定属性。

希望这有帮助。