gpt4 book ai didi

c# - 如何在复杂的 WPF 场景中组织资源(样式,...)?

转载 作者:可可西里 更新时间:2023-11-01 08:01:32 24 4
gpt4 key购买 nike

如何组织 WPF 资源(包括样式、模板等),以便我可以跨 Windows、页面甚至项目使用它们。我有哪些选择来实现我的资源的最大可重用性和可维护的结构(例如每个模板一个文件)?

例如:我正在创建一个 WPF 应用程序,我想使用 TabControl,但我想对其进行重大更改。所以我可以创建一个样式并将其应用于 TabControl 和 TabItem。没关系,但是我可以将我的资源放在哪里以保持我的 Window XAML 清晰并使样式也可以从其他 Windows 或项目访问?

我发现我可以将它添加到 App.xaml,但这只是一个项目的解决方案,并且只允许在该项目的项目之间共享。此外,我认为将这些模板与其他代码稍微分开会更好,而不是将它们全部放在某个页面或 app.xaml 中?

最佳答案

我通常创建一个单独的样式项目,我从我想要设计样式的项目中引用它。样式项目具有如下固定结构:

Styling project

对于每个控件,我都创建了一个样式 ResourceDictionary。例如我的按钮:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="PrimaryButtonStyle" TargetType="Button">
</Style>

<Style x:Key="ToolbarButton" TargetType="Button">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Margin" Value="3"/>
<Setter Property="Background" Value="Transparent"></Setter>
</Style>
</ResourceDictionary>

在一个主要的 ResourceDictionary 中,我合并了所有其他词典,在本例中是在文件 IncaDesign.xaml 中,您可以在上图中看到:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:Commons.Controls;assembly=Commons">

<ResourceDictionary.MergedDictionaries>

<ResourceDictionary Source="Converter/Converter.xaml" />
<ResourceDictionary Source="Styles/Button.xaml" />
<ResourceDictionary Source="BitmapGraphics/Icons.xaml" />

</ResourceDictionary.MergedDictionaries>

<!-- Default Styles -->
<Style TargetType="Button" BasedOn="{StaticResource PrimaryButtonStyle}"></Style>
</ResourceDictionary>

请注意我是如何定义默认样式的,除非您另外指定,否则这些样式会自动应用。在您想要设置样式的每个窗口或控件中,您只需要引用这个 ResourceDictionary。注意源码的定义,它是对程序集的引用(/Commons.Styling;component...)

<UserControl.Resources>        
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Commons.Styling;component/IncaDesign.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>

现在将自动设置默认样式,如果您想显式访问资源,可以使用 StaticResource 执行此操作。

<Viewbox Height="16" Width="16" Margin="0,0,10,0">
<ContentControl Content="{StaticResource FileIcon32}" />
</Viewbox>

在我看来,这是非常好的解决方案,适用于非常复杂的解决方案,包括模块化解决方案,例如使用 PRISM 构建的解决方案。

关于c# - 如何在复杂的 WPF 场景中组织资源(样式,...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15249492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com