スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

マスターページならぬマスターウィンドウが欲しい。(参)

マスターページならぬマスターウィンドウが欲しい。
マスターページならぬマスターウィンドウが欲しい。(弐)
の続き。今回は長い。まずはカスタムコントロールを作る。

using System;
using System.Windows;
using System.Windows.Controls;

namespace TawamureDays {

/// <summary>
/// マスターページならぬ、マスターコンテンツ用コントロール。
/// </summary>
public class TawamureContents : Control {

#region コンストラクタ

/// <summary>
/// staticコンストラクタ
/// </summary>
static TawamureContents() {
DefaultStyleKeyProperty.OverrideMetadata(typeof(TawamureContents),
new FrameworkPropertyMetadata(typeof(TawamureContents)));
}

#endregion
}
}
今回作りたいのは、Contentを1つ持つマスターウィンドウならぬ、マスターコンテンツなので、ContentControlに切り替える。

/// <summary>
/// マスターページならぬ、マスターコンテンツ用コントロール。
/// </summary>
[System.Windows.Markup.ContentProperty("Content")]
public class TawamureContents : ContentControl {

#region コンストラクタ

/// <summary>
/// staticコンストラクタ
/// </summary>
static TawamureContents() {
DefaultStyleKeyProperty.OverrideMetadata(typeof(TawamureContents),
new FrameworkPropertyMetadata(typeof(TawamureContents)));
}

#endregion
}

これに、各々のパーツ様にプロパティを実装していく。具体的には、

ヘッダーが欲しい→ヘッダー用の(依存関係)プロパティを作る
フッターーが欲しい→フッター用の(依存関係)プロパティを作る
ステータスバーが欲しい→ControlTemplateに組み込む。
ステータスメッセージを出したい→ステータスメッセージ用の(依存関係)プロパティを作る

な感じ。

#region 依存関係プロパティ

/// <summary>
/// ヘッダを取得|設定します。
/// </summary>
public object Header {
get {return (object)GetValue(HeaderProperty);}
set {SetValue(HeaderProperty, value);}
}

/// <summary>ヘッダ</summary>
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(object),
typeof(TawamureContents), new UIPropertyMetadata(null));


/// <summary>
/// フッタを取得|設定します。
/// </summary>
public object Footer {
get {return (object)GetValue(FooterProperty);}
set {SetValue(FooterProperty, value);}
}

/// <summary>フッタ</summary>
public static readonly DependencyProperty FooterProperty =
DependencyProperty.Register("Footer", typeof(object),
typeof(TawamureContents), new UIPropertyMetadata(null));


/// <summary>
/// ステータスメッセージを取得|設定します。
/// </summary>
public object StatusMessage {
get { return (object)GetValue(StatusMessageProperty); }
set { SetValue(StatusMessageProperty, value); }
}

/// <summary>ステータスメッセージ</summary>
public static readonly DependencyProperty StatusMessageProperty =
DependencyProperty.Register("StatusMessage", typeof(object),
typeof(TawamureContents), new UIPropertyMetadata(null));

#endregion
型をオブジェクトにしているのは、基本なんでも設定できるようにするため。
ここまでやったら、このクラス用のスタイルを定義する。
Theme\Generic.xamlに記述する。

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TawamureDays">
<Style TargetType="{x:Type local:TawamureContents}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TawamureContents}">
<Grid SnapsToDevicePixels="True"
KeyboardNavigation.TabNavigation="Cycle">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Grid.Row="1">
<DockPanel>
<ContentPresenter Content="{TemplateBinding Header}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
DockPanel.Dock="Top"
/>
<ContentPresenter Content="{TemplateBinding Footer}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
DockPanel.Dock="Bottom"
/>
<ContentPresenter Content="{TemplateBinding Content}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
/>
</DockPanel>
</Border>
<StatusBar Grid.Row="2">
<StatusBar.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</StatusBar.ItemsPanel>
<StatusBarItem Grid.Column="0"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch">
<ContentPresenter HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Focusable="False"
Content="{TemplateBinding StatusMessage}"
/>
</StatusBarItem>
<Separator Grid.Column="1"/>
<StatusBarItem Grid.Column="2"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch">
<ContentPresenter HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Focusable="False"
Content="Zoom(XXX%)"
/>
</StatusBarItem>
<Separator Grid.Column="3"/>
<StatusBarItem Grid.Column="4"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch">
<ContentPresenter HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Focusable="False"
Content="Clock(HH:mm)"
/>
</StatusBarItem>
</StatusBar>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
TemplateBindingを使っているが、別に普通のBindingも使えたりする。
[WPF][C#]TemplateBindingとBindingのRelativeSource TemplatedParentの違い
ここで、一度ビルドしてみる。
で、このコントロールを組み込んでみる。
画像を貼り付けてみようとしたら、勘違いに気づいた。」で使ったWindowを編集する。

<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tw="http://schemas.tawamuredays.jp/wpf/gui"
Title="MainWindow" Height="418" Width="402">
<tw:TawamureContents Name="MainGrid">
<tw:TawamureContents.Background>
<ImageBrush ImageSource="{StaticResource WallPaper}"/>
</tw:TawamureContents.Background>
</tw:TawamureContents>
</Window>

実行すると、こんな感じに変わる。
20120905_3
下にそれっぽいものがくっついた。
これだけでは、HeaderもFooterもないので、何か試しに入れてみる。

<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tw="http://schemas.tawamuredays.jp/wpf/gui"
Title="MainWindow" Height="418" Width="402">
<tw:TawamureContents Name="MainGrid">
<tw:TawamureContents.Header>ここはヘッダの領域です。</tw:TawamureContents.Header>
<tw:TawamureContents.Background>
<ImageBrush ImageSource="{StaticResource WallPaper}" Opacity="0.3"/>
</tw:TawamureContents.Background>
<tw:TawamureContents.Footer>
<TextBlock>
ここはフッタの領域です。Object型なので、何を入れても大丈夫
</TextBlock>
</tw:TawamureContents.Footer>
<tw:TawamureContents.StatusMessage>
ステータスメッセージですね
</tw:TawamureContents.StatusMessage>
<StackPanel>
<TextBlock>ここが本命のContent</TextBlock>
</StackPanel>
</tw:TawamureContents>
</Window>

20120905_4
・今回作ったコントロールを継承する必要はない。
・ウィンドウを作成。直下にあるGridを今回のコントロールに変える。
・StatusBarの表示を切り替えたい時は、新たに依存関係プロパティを作って、Visibilityと連携させる。
後はこいつのDataContextになるViewModelクラスを作るかな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。