将一个大 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
我的问题是:
ResourceDictionary
和 UserControl
有什么区别?你能给我举个例子,我必须使用UserControl
和ResourceDictionary
吗?
您能否给出一个完整的代码示例,如何将一个 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'个单词的多个子字符串