在我的基于桌面的WPF4应用程序中,有一个带有侧边栏菜单的大块,在每个窗口中重复,大约需要70行XAML。为了改善代码重用,我想将XAML文件拆分为两个文件:
据我所知,有两种方法可以解决我的问题:
ResourceDictionary
UserControl
/ CustomControl
我的问题是:
ResourceDictionary
和UserControl
之间有什么区别?你能举例说明我必须使用UserControl
和ResourceDictionary
吗?
您能举一个完整的代码示例,了解如何将一个XAML文件的内容包含/导入到其他文件中吗?
P.S。以下是我要导出到单独的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>
答案 0 :(得分:17)
ResourceDictionary只是样式/模板等的容器。因此,您可以选择使用样式(并通过ResourceDictionary引用它)或UserControl。
为了区分这两者,请问自己一个问题:你是否正在实现一些现有控件的另一种外观,或者你正在实现一些非常新的东西,它不仅仅是一个ListView(或一个Border,或一个ComboBox)等等。)?在前一种情况下,使用一种风格;在后者中,创建一个新的UserControl。
特别针对您的情况,我会选择UserControl。
代码示例(虽然未完整)
(请注意,可以使用VS的“添加新UserControl”插入以下代码的模板)
的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>
答案 1 :(得分:2)
如果您可以在Expression Blend中使用Expression Studio,只需右键单击任何控件并将其转换为用户控件即可。就这么简单。
用户控件适合拆分XAML文件。实质上,它用于重新定义现有控件的行为。
但是,使用用户控件,您可以定义整个WPF布局控件并将其转换为用户控件,其中包含子内容。这对于分布在多个开发人员中的项目非常有用,也可以用来模拟MDI的行为,这在WPF中是不存在的。