加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:49:45 所属栏目:百科 来源:网络整理
导读:如何组织 WPF资源(包括样式,模板等),以便我可以在 Windows,Pages甚至项目中使用它们.我有什么选择来实现我的资源的最大可重用性和可维护的结构(例如每个模板一个文件)? 例如:我正在创建一个WPF应用程序,我想使用一个TabControl,但是我想对其进行重大更改.
如何组织 WPF资源(包括样式,模板等),以便我可以在 Windows,Pages甚至项目中使用它们.我有什么选择来实现我的资源的最大可重用性和可维护的结构(例如每个模板一个文件)?

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

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

解决方法

我通常创建一个独立的造型项目,我从项目中引用我想要的风格.造型项目具有如下固定结构:

对于每个控件,我创建一个样式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,10,0">
    <ContentControl Content="{StaticResource FileIcon32}" />
</Viewbox>

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读