WPF 自定义控件库

一、使用场景

  • 开发自定义控件库时,向外部暴露可复用的样式、模板、画笔等资源。
  • 多模块应用中,共享通用资源(如主题样式)。
  • 需要避免资源键命名冲突的场景。

二 ,程序

image

 1.静态的后台代码 资源键

// MyControlLibrary/ResourceKeys.cs
using System.Windows;

namespace MyControlLibrary;

public static class ResourceKeys
{
    // 按钮样式资源键
    public static ComponentResourceKey CustomButtonStyleKey =>
        new ComponentResourceKey(typeof(ResourceKeys), "CustomButtonStyle");

    // 文本框样式资源键
    public static ComponentResourceKey CustomTextBoxStyleKey =>
        new ComponentResourceKey(typeof(ResourceKeys), "CustomTextBoxStyle");

    // 主题色画笔资源键
    public static ComponentResourceKey ThemeBrushKey =>
        new ComponentResourceKey(typeof(ResourceKeys), "ThemeBrush");
}

2.前台代码

<!-- MyControlLibrary/Themes/Generic.xaml -->
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyControlLibrary">
    <SolidColorBrush 
        x:Key="{x:Static local:ResourceKeys.ThemeBrushKey}" 
        Color="#FF2196F3"/>
    
    <Style 
        x:Key="{x:Static local:ResourceKeys.CustomButtonStyleKey}" 
        TargetType="Button">
        <Setter Property="Background" Value="{StaticResource {x:Static local:ResourceKeys.ThemeBrushKey}}"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Padding" Value="12,6"/>
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border 
                        Background="{TemplateBinding Background}" 
                        CornerRadius="4" 
                        Padding="{TemplateBinding Padding}"
                        SnapsToDevicePixels="True">
                        <ContentPresenter 
                            HorizontalAlignment="Center" 
                            VerticalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    
    <Style 
        x:Key="{x:Static local:ResourceKeys.CustomTextBoxStyleKey}" 
        TargetType="TextBox">
        <Setter Property="BorderBrush" Value="{StaticResource {x:Static local:ResourceKeys.ThemeBrushKey}}"/>
        <Setter Property="BorderThickness" Value="2"/>
        <Setter Property="Padding" Value="8"/>
        <Setter Property="FontSize" Value="14"/>
    </Style>
</ResourceDictionary>

3.下面是引用上面的项目,在依赖项中引用一下

App.xaml

<Application x:Class="WpfApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- 合并控件库的资源字典(Pack URI格式) -->
                <ResourceDictionary Source="/MyControlLibrary;component/Themes/Generic.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

 

MainWindow.xaml

<!-- WpfApp/MainWindow.xaml -->
<Window x:Class="WpfApp.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:lib="clr-namespace:MyControlLibrary;assembly=MyControlLibrary"
        mc:Ignorable="d"
        Title=".NET 8 ComponentResourceKey 示例" 
        Height="350" Width="500">

    <StackPanel Margin="20" >
        <TextBlock FontSize="16" FontWeight="Bold" Text="使用ComponentResourceKey的资源示例"/>

        <!-- 使用自定义按钮样式 -->
        <Button 
            Content="自定义按钮" 
            Style="{StaticResource {x:Static lib:ResourceKeys.CustomButtonStyleKey}}"/>

        <!-- 使用自定义文本框样式 -->
        <TextBox 
            Text="自定义文本框" 
            Style="{StaticResource {x:Static lib:ResourceKeys.CustomTextBoxStyleKey}}"/>

        <!-- 使用主题色画笔 -->
        <Border 
            Height="60" 
            Background="{StaticResource {x:Static lib:ResourceKeys.ThemeBrushKey}}">
            <TextBlock 
                Text="主题色背景" 
                Foreground="White" 
                HorizontalAlignment="Center" 
                VerticalAlignment="Center"/>
        </Border>
    </StackPanel>
</Window>

 

posted @ 2025-10-27 16:38  灰色淡季  阅读(5)  评论(0)    收藏  举报