web-dev-qa-db-ja.com

1つの大きなXAMLをサブXAMLファイルの数に分割します

私のWPF4デスクトップベースのアプリケーションには、各ウィンドウで繰り返され、約70行のXAMLを使用するサイドバーメニューのある大きなブロックがあります。コードの再利用を改善するために、XAMLファイルを2つのファイルに分割したいと思います。

  1. XAML-サイドバーメニューのコードを含むファイル(約70行)
  2. サイドバーメニューコードを含むXAMLファイルへの"include/reference"を含むベースXAMLファイル

私が理解したように、私の問題を実装するには2つの方法があります。

  1. ResourceDictionaryを使用します
  2. UserControl/CustomControlを使用します

私の質問は次のとおりです。

  1. ResourceDictionaryUserControlの違いは何ですか? UserControlを使用する必要がある場所とResourceDictionaryを使用する場所の例を教えてください。

  2. ある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>
21
Mike B.

ResourceDictionaryは、スタイル/テンプレートなどの単なるコンテナーです。したがって、スタイルを使用する(そして、ResourceDictionaryを介して参照する)か、UserControlを使用するかを実際に選択できます。

2つを区別するために、自分自身に質問してください。既存のコントロールの別の外観を実装しているのか、それともListView(またはBorder、ComboBoxなど)以上の本当に新しいものを実装しているのか。 ?前者の場合、スタイルを使用します。後者では、新しいUserControlを作成します。

特にあなたの場合、私はUserControlを選びます。


コード例(完全ではありませんが)

(次のコードのテンプレートは、VSの「addnewUserControl」で挿入できることに注意してください)

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>
17
Vlad

Expression Studioを手に入れることができれば、Expression Blendで、任意のコントロールを右クリックして、ユーザーコントロールに変換するだけです。それと同じくらい簡単です。

ユーザーコントロールは、XAMLファイルを分割するのに適しています。本質的には、既存のコントロールの動作を再定義するために使用されます。

ただし、ユーザーコントロールを使用すると、WPFレイアウトコントロール全体を定義して、子コンテンツを含むユーザーコントロールに変換できます。これは、複数の開発者にまたがるプロジェクトに非常に役立ちます。また、WPFにはないMDIの動作をエミュレートするためにも使用できます。

2
r3st0r3