将一个大 XAML 拆分为多个 Sub-XAML 文件

Posted

技术标签:

【中文标题】将一个大 XAML 拆分为多个 Sub-XAML 文件【英文标题】:Split one big XAML in number of Sub-XAML files 【发布时间】:2011-06-26 01:25:55 【问题描述】:

在我的基于 WPF4 桌面的应用程序中,有一个带有侧边栏菜单的大块,在每个窗口中重复出现并占用大约 70 行 XAML。为了提高代码重用,我想将 XAML 文件拆分为两个文件:

    包含侧边栏菜单代码的 XAML 文件(约 70 行) 基本 XAML 文件包含对带有侧边栏菜单代码的 XAML 文件的“包含/引用”

据我了解,有两种方法可以解决我的问题:

    使用ResourceDictionary 使用UserControl/CustomControl

我的问题是:

    ResourceDictionaryUserControl 有什么区别?你能给我举个例子,我必须使用UserControlResourceDictionary 吗?

    您能否给出一个完整的代码示例,如何将一个 XAML 文件的内容包含/导入到另一个文件中?

附:这是我要导出到单独的 XAML 文件的代码示例:

<Border Style = "StaticResource Body_SideBarMenu_Border_Settings">
    <StackPanel Style = "StaticResource Body_SideBarMenu">
        <TextBlock Style = "StaticResource Body_SideBarMenu_Title"
                   Text = "x:Static res:Resources.WinApp_SideBarMenu_Title" />
        <TextBlock x:Name = "SideBar_WinReports"
                   Style = "StaticResource Body_SideBarMenu_Item"
                   Text = "x:Static res:Resources.DashListMarker">
            <Hyperlink KeyboardNavigation.TabIndex = "12"
                       Style = "StaticResource Body_SideBarMenu_Item_Hyperlink"
                       Click = "Call_WinReports_Click">
                <TextBlock Text = "x:Static res:Resources.WinApp_ModuleName_Reports" />
            </Hyperlink>
        </TextBlock>
    </StackPanel>
</Border>

【问题讨论】:

【参考方案1】:

ResourceDictionary 只是您的样式/模板等的容器。因此您确实可以选择使用样式(并通过 ResourceDictionary 引用它)或 UserControl。

为了区分两者,问自己一个问题:您是在实现一些现有控件的另一种外观,还是在实现一些真正新的东西,而不仅仅是一个 ListView(或一个边框,或一个 ComboBox等等。)?在前一种情况下,使用样式;在后者中,创建一个新的 UserControl。

特别是针对您的情况,我会选择 UserControl。


代码示例(虽然不完整)

(请注意,下面代码的模板可以用VS的“添加新用户控件”插入)

Xaml:

<UserControl x:Class="SomeNamespace.SidebarMenu"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <UserControl.Resources> <!-- you can define local styles here -->
        <Style x:Key="SidebarMenuTextblock" TargetType=TextBlock>
            ...
        </Style>
    </UserControl.Resources>

    <Border Background=...>
        <StackPanel>

            <TextBlock
                x:Name="Put_a_name_if_you_want_to_reference_this_item_in_code_behind"
                Style="StaticResource SidebarMenuTextblock"
                Text="x:Static res:Resources.WinApp_SideBarMenu_Title" />

            ...

        </StackPanel>
    </Border>

</UserControl>

.cs:

using System;
using System.Windows;
using System.Windows.Controls;

namespace SomeNamespace

    public partial class SidebarMenu : UserControl
    
        public NumericUpDown()
        
            InitializeComponent();
        
        ...
        // define here your properties etc,
    

现在,您可以像这样使用控件了:

<Window
    x:Class="SomeOtherNamespace.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="clr-namespace:SomeNamespace">

    <Grid>
        <controls:SidebarMenu PropertyIfYouDefinedOne="SomeValue"/>
        ...
    </Grid>

</Window>

【讨论】:

【参考方案2】:

如果您可以使用 Expression Studio,在 Expression Blend 中,您只需右键单击任何控件并将其转换为用户控件。就这么简单。

用户控件非常适合拆分 XAML 文件。本质上,它用于重新定义现有控件的行为。

但是,使用用户控件,您可以定义整个 WPF 布局控件并将它们转换为用户控件,其中包含子内容。这对于跨多个开发人员的项目非常有帮助,也可以用来模拟 MDI 的行为,这在 WPF 中是不存在的。

【讨论】:

而且,这不仅仅是考虑可重用控件。您也可以对不可重用的控件执行此操作。

以上是关于将一个大 XAML 拆分为多个 Sub-XAML 文件的主要内容,如果未能解决你的问题,请参考以下文章

通过python将一个大字符串拆分为包含'n'个单词的多个子字符串

将一个大的 json 文件拆分为多个较小的文件

如何将大文件(12gb)拆分为多个 1GB 压缩(.gz)档案? C#

将数据帧拆分为多个数据帧

如何将yaml文件拆分为多个文件?

用shell写一个程序,把一个大文件拆分成为多个小文件,要求:拆分文件以“;”作为分隔判断来拆分文件;