如何解决模板复制中 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.xaml
或 CancelButton.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
标记扩展(在运行时解析资源 - 这里是画笔)替换所有以画笔为目标的BaseButtonStyle
和StaticResource
引用 - 为您的一个按钮创建一种基于中性基本样式
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)。
查找在设置属性的元素定义的资源字典中检查请求的键 [...] 查找向上遍历逻辑树到父元素及其资源字典。这个过程一直持续到到达根元素。 [...]
这里有一个这样的资源字典示例,用于带有延迟着色的 Save 和 Cancel 按钮。
<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 举报,一经查实,本站将立刻删除。