在一些Sub-XAML文件中拆分一个大的XAML

时间:2011-02-12 11:50:19

标签: wpf xaml user-controls code-reuse resourcedictionary

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

  1. 包含侧边栏菜单代码的XAML文件(≈70行)
  2. 包含带有侧边栏菜单代码的XAML文件的«include / reference»的基本XAML文件
  3. 据我所知,有两种方法可以解决我的问题:

    1. 使用ResourceDictionary
    2. 使用UserControl / CustomControl
    3. 我的问题是:

      1. ResourceDictionaryUserControl之间有什么区别?你能举例说明我必须使用UserControlResourceDictionary吗?

      2. 您能举一个完整的代码示例,了解如何将一个XAML文件的内容包含/导入到其他文件中吗?

      3. 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>
        

2 个答案:

答案 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中是不存在的。