c# - wpf默认样式和样式基础

标签 c# wpf xaml styles

我正在尝试制作一个 wpf 样式,它允许我: 1. 基于基本样式的基础替代样式 2. 将基本样式设置为每个控件在未应用样式时使用的默认样式。

例如,我有代码为按钮设置样式......

<!--Base Button-->
<Style TargetType="Button" x:Key="BaseButton">
    <Setter Property="Width" Value="auto"/>
    <Setter Property="MaxWidth" Value="100"/>
    <Setter Property="Height" Value="auto"/>
    <Setter Property="MaxHeight" Value="50"/>

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Cursor" Value="Hand"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Opacity" Value=".85"/>
        </Trigger>
    </Style.Triggers>
</Style>
<!--Apply Base to any Button without a style-->
<Style TargetType="Button" BasedOn="{StaticResource BaseButton}"/>

这是特定按钮的样式...

<Style TargetType="Button" x:Key="DeleteBtn" BasedOn="{StaticResource BaseButton}">
    <Setter Property="Width" Value="100"/>
    <Setter Property="Height" Value="35"/>
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="(some url)" Height="16" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                    <Label Content="Delete" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                </StackPanel>                    
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

正如您所看到的,我希望能够将“DeleteBtn”样式建立在基础上,但也让基础成为屏幕上放置的每个没有特定样式集的按钮的默认值。目前,这仅适用于按钮,不适用于其他控件。上面的例子确实有效,但我似乎无法对标签、文本框等做同样的事情。任何想法或输入将不胜感激:)

这是一个不起作用的示例..

<!--Base Icon-->
<Style TargetType="Image" x:Key="BaseIcon">
    <Setter Property="VerticalAlignment" Value="Top"/>
    <Setter Property="HorizontalAlignment" Value="Right"/>
</Style>
<!--Apply Base to any Icon without a style-->
<Style TargetType="Image" BasedOn="{DynamicResource BaseIcon}"/>

它给出了一个错误:无法在“Style”类型的“BasedOn”属性上设置“DynamicResourceExtension”。 “DynamicResourceExtension”只能在 DependencyObject 的 DependencyProperty 上设置。

最佳答案

您的示例仅适用于按钮,因为您的“基本”样式仅针对按钮。 即

TargetType="Button"

您可以尝试创建一个针对父 FrameworkElement 的样式。请注意,并非所有属性都受支持。有些属性是子控件所独有的。

关于c# - wpf默认样式和样式基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22491138/

相关文章:

c# - 更新其中一个相同型号网络适配器的驱动程序

c# - 根据其他列中的值更改 DataGridTextColumn 单元格上的字符串格式,并保持值可排序

c# - 在 UWP 中,有没有一种方法可以让列相互环绕?

c# - WPF 有条件地启用键绑定(bind)

wpf - 自定义控件中 ContextMenu 的正确绑定(bind)

c# - 绑定(bind)到父 DataContext 中的依赖属性

c# - 如何从打印机队列中检索作业列表或作业数量?

c# - 在任务管理器中更改进程名称

c# - XmlReaders 是否返回 XML 声明?

c# - WPF - 通过 TableAdapter、DataContext/Dataview 和 DataGrid 将数据库编辑到 TextBox