Разделить один большой XAML на количество файлов Sub-XAML - PullRequest
20 голосов
/ 12 февраля 2011

В моем приложении для рабочего стола WPF4 есть большой блок с меню боковой панели, которое повторяется в каждом окне и занимает около 70 строк XAML.Чтобы улучшить повторное использование кода, я хотел бы разбить XAML-файл на два файла:

  1. XAML-файл, содержащий код для меню боковой панели (≈70 строк)
  2. Базовый XAML-файлкоторый содержит «include / reference» для XAML-файла с кодом меню боковой панели

Как я понял, есть два способа реализации моей проблемы:

  1. Использование ResourceDictionary
  2. Использование UserControl / CustomControl

Мои вопросы:

  1. В чем разница между ResourceDictionary и UserControl?Не могли бы вы привести примеры, где я должен использовать UserControl, а где ResourceDictionary?

  2. Не могли бы вы привести пример полного кода, как включить / импортировать содержимое одного XAML-файла вДругой?

PS Вот пример кода, который я хочу экспортировать в отдельный 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 ]

17 голосов
/ 12 февраля 2011

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>
2 голосов
/ 18 февраля 2011

Если вы можете заполучить Expression Studio в Expression Blend, вы можете просто щелкнуть правой кнопкой мыши на любом элементе управления и преобразовать его в пользовательский элемент управления. Так легко.

Пользовательские элементы управления хороши для разбиения файла XAML. По сути, он используется для переопределения поведения существующего элемента управления.

Однако с помощью пользовательских элементов управления вы можете определить целые элементы управления макетом WPF и преобразовать их в пользовательский элемент управления с дочерним содержимым внутри них. Это очень полезно для проекта, распространяемого среди нескольких разработчиков, и может также использоваться для эмуляции поведения MDI, которое в WPF вроде отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...