样式资源键-独立的控件库

自定义样式,供其他项目调用

第一步创建一个控件库项目

第二步创建一个资源键类

using System.Windows;
namespace SharedStyles;

public static class ButtonKeys
{
    // 主按钮样式资源键(强类型定义)
    public static ComponentResourceKey PrimaryButtonKey =>
        new ComponentResourceKey(typeof(ButtonKeys), "PrimaryButton");

    // 次要按钮样式资源键(强类型定义)
    public static ComponentResourceKey SecondaryButtonKey =>
        new ComponentResourceKey(typeof(ButtonKeys), "SecondaryButton");
}

第三步创建前台代码,建立一个xaml文件。注意:以下代码引用键的方式有两种 一个是静态引用,一个是直接用,推荐静态引用(可以帮你检查代码有无错误).

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:SharedStyles">

    <!-- 主按钮样式(使用x:Static引用资源键) -->
    <Style x:Key="{x:Static local:ButtonKeys.PrimaryButtonKey}" TargetType="Button">
        <Setter Property="Background" Value="Green" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Padding" Value="12,6" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="Margin" Value="5" />
       
        <!-- 重写模板,避免默认样式干扰 -->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <!-- 用Border作为按钮的视觉容器 -->
                    <Border 
                    x:Name="buttonBorder" 
                        Background="{TemplateBinding Background}"
                        
                        BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Padding="{TemplateBinding Padding}"
                    CornerRadius="4">
                       
                        <ContentPresenter 
                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                    </Border>

                    <!-- 模板内的触发器(优先级高于样式触发器) -->
                    <ControlTemplate.Triggers>
                        <!-- 鼠标悬停时改变背景 -->
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="buttonBorder" Property="Background" Value="Red" />
                        </Trigger>
                        <!-- 可选:添加点击状态 -->
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="buttonBorder" Property="Background" Value="DarkRed" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <!-- 次要按钮样式(直接用ComponentResourceKey定义) -->
    <Style x:Key="{ComponentResourceKey ResourceId=SecondaryButton, TypeInTargetAssembly={x:Type local:ButtonKeys}}" 
           TargetType="Button">
        <Setter Property="Background" Value="#F5F5F5" />
        <Setter Property="Foreground" Value="#333" />
        <Setter Property="Padding" Value="12,6" />
        <Setter Property="Margin" Value="5" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="#E0E0E0" />
            </Trigger>
        </Style.Triggers>
    </Style>

</ResourceDictionary>

以上一个控件库 程序集就建立好了。

下面是引用

第四步 创建一个普通的WPF窗体项目

1.命名空间要引用xmlns:shared="clr-namespace:SharedStyles;assembly=SharedStyles"

2.合并资源文件

3.使用资源样式

<Window x:Class="MainApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:shared="clr-namespace:SharedStyles;assembly=SharedStyles"
        mc:Ignorable="d"
        Title="主应用程序" Height="300" Width="400">
<!--也可以在APP.XAML中合并-->
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- 引用类库中的资源字典 -->
                <ResourceDictionary Source="pack://application:,,,/SharedStyles;component/ButtonStyles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="使用共享样式的按钮" FontSize="16" HorizontalAlignment="Center"/>

        <!-- 使用主按钮样式(x:Static引用) -->
        <Button Content="主按钮" 
                Style="{StaticResource {x:Static shared:ButtonKeys.PrimaryButtonKey}}" />

        <!-- 使用次要按钮样式(ComponentResourceKey直接引用) -->
        <Button Content="次要按钮" 
                Style="{StaticResource {ComponentResourceKey ResourceId=SecondaryButton, TypeInTargetAssembly={x:Type shared:ButtonKeys}}}" />
    </StackPanel>
</Window>

 

posted @ 2025-10-29 16:13  灰色淡季  阅读(9)  评论(0)    收藏  举报