WPF で Window をレイアウトしていると、少し複雑な UI だと XAML が長くなりすぎて非常に見難くなります。これを回避するために、XAML を分割して記述し、インポートするような方法を検索してみたのですが、リソースに定義したりだとか、なんとなく遠まわしに思える方法ばかりしか見つけることが出来ませんでした。
それで結局、良く見ると他のファイルで既に自分でやっていたことに気付いたのですが、すっかり忘れていたので、改めてここにメモを残しておきます。・・・たぶん、ですが、これが本当は基本なので、基本過ぎて、検索にも出てこないのかなーと思ったりもいたします。
まず、読み込まれる側の xaml を書きます。TabContent1.xaml という名前で、普通に UserControl で作成します。
1 2 3 4 5 6 7 8 9 10 11 |
<UserControl x:Class="MyProject.Views.TabContent1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="600"> <Grid> <TextBox Text="" x:Name="MyTextBox1" /> </Grid> </UserControl> |
次に、読み込む側の xaml です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<Window x:Class="MyProject.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:v="clr-namespace:MyProject.Views"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="250*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> </Grid.ColumnDefinitions> <StackPanel> <!-- 親Viewの要素 --> </StackPanel> <TabControl> <TabItem Header="{Binding TabContent1LabelText}"> <v:TabContent1 x:Name="MyTabContent1"/> </TabItem> <TabItem Header="{Binding TabContent2LabelText}"> <v:TabContent2 x:Name="MyTabContent2"/> </TabItem> </TabControl> </Grid> </Window> |
↑で強調した3行に注目です。
強調行の1つ目は、サブビューとなるクラス群が収まった場所の名前空間を、接頭辞 v として定義しています。
強調行の残り2つは、作成した v 接頭辞を付けて、xaml のクラス名を呼び出しています。x:Name は、プログラムからアクセスするための識別子です。
この状態で、MainWindow.xaml.cs のコードビハインドから子ビューの要素にアクセスするには次のように書けます。
1 |
this.MyTabContent1.MyTextBox1.Text = " HOGEHOGE"; |
以上、とても簡単ですが、いざ検索すると情報が出てこなかったので、メモを残しておきます。