微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模板复制中 WPF 中的 Application.Resources - 我如何才能获得订单?

如何解决模板复制中 WPF 中的 Application.Resources - 我如何才能获得订单?

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

<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"/>

还有更多!

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

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

因为有很多自动生成的行,所以我的 App.xaml 大约有 500 多行长,只需要对按钮进行一些颜色更改。

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

这将帮助我能够将每个按钮提取到它自己的文件中,以获得更清晰的文件,例如 SaveButton.xamlCancelButton.xaml,并在我需要时重新导入它们。 这可能吗?

解决方法

创建一个新的资源字典 Project > 添加新项目... > 资源字典 (WPF) 并将其命名为 {{1} }.将资源复制到这个新的资源字典中。

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:Key
  • DynamicResource 标记扩展(在运行时解析资源 - 这里是画笔)替换所有以画笔为目标的 BaseButtonStyleStaticResource 引用
  • 为您的一个按钮创建一种基于中性基本样式 x:Static 的样式,然后将所有画笔从基本样式移动到 BaseButtonStyle新风格。
  • 自定义画笔以获得您的自定义样式。
  • 使用每个新按钮的画笔复制此样式,替换其 Resources 并调整画笔。

像上面一样将资源字典添加到应用程序资源中。现在,您可以使用其 x:Key 显式引用代码中的每个特殊按钮样式。

x:Key

At runtime the brushes will be resolved searching up the logical tree。由于画笔在基本样式中不可用,因此可以在查找过程中的派生样式中找到它们。有关资源查找的详细信息,请参阅 Overview of XAML resources (WPF .NET)

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

这里有一个这样的资源字典示例,用于带有延迟着色的 SaveCancel 按钮。

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

当然,您也可以根据需要将它们拆分为多个不同的资源词典。

,

我认为您可以在您的自定义按钮样式中使用类似以下内容,或者创建一个针对 Button 的通用样式,然后在您想要的 Buttons 中使用它。

          <Style.Triggers>                                       
                <Trigger Property="IsMouseOver"   Value="True">
                    <Setter Property="Foreground" Value="Green" />
                </Trigger>                
            </Style.Triggers>    

或者,您可以使用 MouseEnter 和 MouseLeave 事件并手动更改代码中的颜色,但这通常不是首选

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。