私のWPF4デスクトップベースのアプリケーションには、各ウィンドウで繰り返され、約70行のXAMLを使用するサイドバーメニューのある大きなブロックがあります。コードの再利用を改善するために、XAMLファイルを2つのファイルに分割したいと思います。
私が理解したように、私の問題を実装するには2つの方法があります。
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>
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>
Expression Studioを手に入れることができれば、Expression Blendで、任意のコントロールを右クリックして、ユーザーコントロールに変換するだけです。それと同じくらい簡単です。
ユーザーコントロールは、XAMLファイルを分割するのに適しています。本質的には、既存のコントロールの動作を再定義するために使用されます。
ただし、ユーザーコントロールを使用すると、WPFレイアウトコントロール全体を定義して、子コンテンツを含むユーザーコントロールに変換できます。これは、複数の開発者にまたがるプロジェクトに非常に役立ちます。また、WPFにはないMDIの動作をエミュレートするためにも使用できます。