首页 > 解决方案 > 模板复制中的 WPF 中的 Application.Resources - 我怎样才能获得订单?

问题描述

我对 WPF 很陌生。我需要更改按钮鼠标悬停颜色,所以我右键单击按钮,然后复制模板。App.xaml因此,Visual Studio在我现在可以设置按钮设计的地方添加了很多新行,如下所示:

<Application x:Class="Thermologger.Start.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Thermologger.Start"
             Startup="Application_Startup">
    <!--StartupUri="MainWindow.xaml"-->
             
    <Application.Resources>

        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <SolidColorBrush x:Key="Button.Static.Background" Color="#ff609d9f"/>
        <SolidColorBrush x:Key="Button.Static.Border" Color="#ff609d9f"/>
        <SolidColorBrush x:Key="Button.Static.Foreground" Color="white"/>
        <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#cf609d9f"/>
        <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#cf609d9f"/>
        <SolidColorBrush x:Key="Button.Pressed.Background" Color="#cf609d9f"/>
        <SolidColorBrush x:Key="Button.Pressed.Border" Color="black"/>
        <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>

还有更多!

所以现在我想用另一个按钮和其他颜色来做到这一点 - 所以我再次做了同样的事情,那就是当视觉工作室开始给它编号时:

<SolidColorBrush x:Key="Button.Static.Background" Color="#ff609d9f"/>
<SolidColorBrush x:Key="Button.Static.Background1" Color="#ff609d9f"/>

而且因为它是很多自动生成的线条,所以我App.xaml的大约 500 多条线长,只是按钮的一些颜色变化。

所以我的问题是,我现在怎样才能做得更好?

这将有助于我能够将每个按钮提取到它自己的文件中,以获得更清晰的文件,SaveButton.xaml或者CancelButton.xaml在需要时重新导入它们。那可能吗?

标签: c#wpfxamlcontroltemplate

解决方案


创建一个新的资源字典Project > Add new item... > Resource Dictionary (WPF)并将其命名为SaveButton.xaml。将资源复制到这个新的资源字典中。

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

   <Style x:Key="FocusVisual">
      <Setter Property="Control.Template">
         <Setter.Value>
            <ControlTemplate>
               <Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>
   <SolidColorBrush x:Key="Button.Static.Background" Color="#ff609d9f"/>

   <!-- ...other resources. -->

</ResourceDictionary>

为其他按钮样式创建一个字典并将它们添加到应用程序资源中。

<Application x:Class="Thermologger.Start.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Thermologger.Start"
             Startup="Application_Startup">
   <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="SaveButton.xaml"/>
            <!-- ...other resource dictionaries. -->
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
   </Application.Resources>
</Application>

如果您只想更改颜色,则不需要复制按钮样式和模板。一种方法可能是为您的不同样式分离画笔,如下所示:

  • 创建资源字典,例如ButtonStyles.xaml.
  • 在那里提取默认的按钮样式和模板。
  • 将按钮样式重命名x:KeyBaseButtonStyle.
  • 用标记扩展替换所有以画笔为目标StaticResourcex:Static引用DynamicResource(在运行时解析资源 - 这里是画笔)
  • 为您的一个按钮创建一个基于您的中性基本样式的样式BaseButtonStyle,并将所有画笔从基本样式移动到Resources新样式的。
  • 自定义画笔以获得您的自定义样式。
  • 使用每个新按钮的画笔复制此样式,替换它x:Key并调整画笔。

像上面一样将资源字典添加到应用程序资源中。现在,您可以在代码中使用其x:Key.

<StackPanel>
   <Button Style="{DynamicResource SaveButtonStyle}" Content="Test"/>
   <Button Style="{DynamicResource CancelButtonStyle}" Content="Test"/>
</StackPanel>

在运行时,画笔将在逻辑树上进行解析。由于画笔在基本样式中不可用,因此在查找过程中可以在派生样式中找到它们。有关资源查找的详细信息,请参阅XAML 资源概述 (WPF .NET)

查找在由设置属性的元素定义的资源字典中检查请求的键 [...] 查找向上遍历逻辑树到父元素及其资源字典。这个过程一直持续到到达根元素。[...]

这是一个用于保存取消按钮的资源字典示例,带有惰性着色。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
   <Style x:Key="FocusVisual">
      <Setter Property="Control.Template">
         <Setter.Value>
            <ControlTemplate>
               <Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>
   <Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}">
      <Setter Property="FocusVisualStyle" Value="{DynamicResource FocusVisual}"/>
      <Setter Property="Background" Value="{DynamicResource Button.Static.Background}"/>
      <Setter Property="BorderBrush" Value="{DynamicResource Button.Static.Border}"/>
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
      <Setter Property="BorderThickness" Value="1"/>
      <Setter Property="HorizontalContentAlignment" Value="Center"/>
      <Setter Property="VerticalContentAlignment" Value="Center"/>
      <Setter Property="Padding" Value="1"/>
      <Setter Property="Template">
         <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
               <Border x:Name="border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="true">
                  <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
               </Border>
               <ControlTemplate.Triggers>
                  <Trigger Property="IsDefaulted" Value="true">
                     <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                  </Trigger>
                  <Trigger Property="IsMouseOver" Value="true">
                     <Setter Property="Background" TargetName="border" Value="{DynamicResource Button.MouseOver.Background}"/>
                     <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource Button.MouseOver.Border}"/>
                  </Trigger>
                  <Trigger Property="IsPressed" Value="true">
                     <Setter Property="Background" TargetName="border" Value="{DynamicResource Button.Pressed.Background}"/>
                     <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource Button.Pressed.Border}"/>
                  </Trigger>
                  <Trigger Property="IsEnabled" Value="false">
                     <Setter Property="Background" TargetName="border" Value="{DynamicResource Button.Disabled.Background}"/>
                     <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource Button.Disabled.Border}"/>
                     <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{DynamicResource Button.Disabled.Foreground}"/>
                  </Trigger>
               </ControlTemplate.Triggers>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>

   <Style x:Key="SaveButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}">
      <Style.Resources>
         <SolidColorBrush x:Key="Button.Static.Background" Color="Red"/>
         <SolidColorBrush x:Key="Button.Static.Border" Color="Blue"/>
         <SolidColorBrush x:Key="Button.MouseOver.Background" Color="Yellow"/>
         <SolidColorBrush x:Key="Button.MouseOver.Border" Color="Purple"/>
         <SolidColorBrush x:Key="Button.Pressed.Background" Color="Green"/>
         <SolidColorBrush x:Key="Button.Pressed.Border" Color="Orange"/>
         <SolidColorBrush x:Key="Button.Disabled.Background" Color="Brown"/>
         <SolidColorBrush x:Key="Button.Disabled.Border" Color="Aqua"/>
         <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="AntiqueWhite"/>
      </Style.Resources>
   </Style>

   <Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}">
      <Style.Resources>
         <SolidColorBrush x:Key="Button.Static.Background" Color="Black"/>
         <SolidColorBrush x:Key="Button.Static.Border" Color="DarkSlateGray"/>
         <SolidColorBrush x:Key="Button.MouseOver.Background" Color="DimGray"/>
         <SolidColorBrush x:Key="Button.MouseOver.Border" Color="DarkGray"/>
         <SolidColorBrush x:Key="Button.Pressed.Background" Color="LightGray"/>
         <SolidColorBrush x:Key="Button.Pressed.Border" Color="Gray"/>
         <SolidColorBrush x:Key="Button.Disabled.Background" Color="GhostWhite"/>
         <SolidColorBrush x:Key="Button.Disabled.Border" Color="DimGray"/>
         <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="LightSlateGray"/>
      </Style.Resources>
   </Style>

</ResourceDictionary>

当然,如果需要,您也可以将它们拆分为几个不同的资源字典。


推荐阅读