WPFでテンプレートウィンドウを作成する方法は?
-
05-07-2019 - |
質問
だから、私はたくさんのウィンドウを持ち、すべてが同じ基本レイアウトを持つアプリケーションを構築しています:
- メインウィンドウ
- 上隅のロゴ
- タイトルブロック
- 下のステータス表示器
- ウィンドウ固有のコントロール用の領域。
現時点では、すべてのウィンドウでこの構造を再作成する必要があります。理想的には、このレイアウトを単一の場所、おそらく使いやすいようにカスタムWindowサブクラスにコーディングしたいです。誰が始め方の手がかりや、同様の問題の以前の経験がありますか?
解決
以下に示すように、これを達成するためにウィンドウをターゲットとする新しいControlTemplateを作成できます。
<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0.93*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.21*"/>
<ColumnDefinition Width="0.79*"/>
</Grid.ColumnDefinitions>
<ContentPresenter
Grid.ColumnSpan="2"
Grid.Row="1"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
/>
<ResizeGrip
HorizontalAlignment="Right"
x:Name="WindowResizeGrip"
VerticalAlignment="Bottom"
IsTabStop="False"
Visibility="Collapsed"
Grid.Column="1"
Grid.Row="2"
/>
<TextBlock Text="My Logo" />
<TextBlock Grid.Column="1" Text="My Title"/>
<StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
<Condition Property="WindowState" Value="Normal"/>
</MultiTrigger.Conditions>
<Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
他のヒント
大きなアーキテクチャシフトを行うのに十分な勇気がある場合は、 CompositeWPF (以前のコードネームはPrism )パターンから&amp; Microsoftの実践者。
興味深いのは、「地域」を定義する機能です。シェル(つまりウィンドウ)で、ビューを使用して領域を塗りつぶします。 Model-View-Presenterパターンを使用して、「ビュー」の独立した開発を可能にします。シェルは領域のみを定義し、そこに配置されたものに直接結合されないため、時間の経過とともに簡単に再配置できるモデルから。これは主に、シェルをビューから切り離し、ビューを互いに分離し、ユニットテストを容易にするのに役立ちます...何とか何とか。
これは大きなジャンプであり、最初は速度が低下するものですが、状況はCompositeWPFが対処することを意図したアプリケーションの種類の1つです。
CompositeWPFの一部として、新規参入者を混乱させる可能性のあるさまざまなパターンを取り入れる必要があります。 UnityContainer、制御の反転、MVP(またはModel / view / view-model)および依存性注入。
どのようにいくつかのビューが作成されているのかが明らかではないため、サンプルアプリを最初に困惑させたときに覚えています。ユニティコンテナはオブジェクトをインスタンス化し、パラメータ化されたコンストラクタを魔法のように呼び出します。
CompositeWPFは、質問に対するエレガントなソリューションですが、単純または簡単なものではありません。最後のプロジェクトでCompositeWPFを使用したので、次の適切なアプリケーションで再び使用するつもりです。
最も簡単なアプローチは、WPFに「ページ」を作成することです。ウィンドウ固有のコントロールの場合は、「フレーム」を配置します。メインウィンドウで。この方法で素敵なナビゲーションを作成することもできます。
「たくさんのウィンドウ」を使用しているのはなぜですか?単一のウィンドウにタブコントロールがあるのはなぜですか?または、ユーザーコントロールを備えた単一のウィンドウですか?
とにかく、あなたの質問に答えるために、ユーザーコントロールは、あなたが望んでいると説明している機能を手に入れたい一つの方法です。
新しいWindowクラスを作成し、それに「子」を持たせます。 「ウィンドウ固有のコントロール」が必要なドックパネルにオブジェクトを埋め込むことができるプロパティ行きます。
新しいウィンドウを起動し、ウィンドウの種類と特定のコントロールを持つユーザーコントロールをインスタンス化して、ユーザーコントロールをウィンドウのChildrenプロパティに追加してから、ウィンドウを表示します。イベントハンドラ、DataContext、および現時点ではないものを結び付けることもできます。