==[[WPF コントロール]]==[[WPF]] | [[Silverlight]] | [[.Net]] | [[Universal Windows Platform]] |
{{amazon|4798114200}}
==コンテンツモデル==
*WPFでは、ほとんどのコントロールを3つのカテゴリに分類WPFでは、ほとんどのコントロールを3つの[[カテゴリ]]に分類
{|class="wikitable"
![[カテゴリ]]
!内容
!例
|レンダコントロール
|画面にピクセルを表示する
|Rectangle、Ellipse[[R]]ectangle、Ellipse
|-
|}
panel.Children.Add(elementPresenter);
[[File:1445_wpf_content_presenter.jpg]]
====ContentPresenterがコンテンツを変換して表示するロジックContentPresenterがコンテンツを変換して表示する[[ロジック]]====#ContentがUIElement型の場合は、表示ツリーに追加ContentがU[[IE]]lement型の場合は、表示ツリーに追加#ContentTemplateが設定されている場合、それを使用してUIElementインスタンスを生成し表示ツリーに追加ContentTemplateが設定されている場合、それを使用してU[[IE]]lementインスタンスを生成し表示ツリーに追加#ContentTemplateSelectorが設定されている場合、それを使用してテンプレートを検索し、そのテンプレートを使用してUIElementインスタンスを生成し表示ツリーに追加ContentTemplateSelectorが設定されている場合、それを使用してテンプレートを検索し、そのテンプレートを使用してU[[IE]]lementインスタンスを生成し表示ツリーに追加#Contentのデータ型にデータテンプレートが関連づけられている場合、それを使用してUIElementインスタンスを作成Contentのデータ型にデータテンプレートが関連づけられている場合、それを使用してU[[IE]]lementインスタンスを作成#Contentのデータ型にUIElement型に変換可能なTypeConverterインスタンスが関連づけられている場合、Contentを変換し表示ツリーに追加Contentのデータ型にU[[IE]]lement型に変換可能なTypeConverterインスタンスが関連づけられている場合、Contentを変換し表示ツリーに追加
#Contentのデータ型に文字列変換可能なTypeConverterインスタンスが関連づけられている場合、ContentをTextBlockで包含し表示ツリーに追加
#最後にContentのToStringを呼び出し、TextBlockで包含し表示ツリーに追加
[[File:1446_wpf_imtes.jpg]]
===ChildrenおよびChild===
*UIElementの子のみをサポートU[[IE]]lementの子のみをサポート
==テンプレート==
*WPFコントロールは、プロパティを使用することによる視覚表示の大幅な制御を可能にする[[WPF]]コントロールは、プロパティを使用することによる視覚表示の大幅な制御を可能にする
*任意のコントロールの外観を完全にカスタマイズすることも可能。
*カスタマイズの範疇全体を宣言型にし一貫したプログラミングモデルを提供する、テンプレートシステム
*コンテンツコントロールはControlから派生し、Templateという共通プロパティを継承
*コンテンツに影響を与えずに、外観を変更したい場合新しいテンプレートを定義出来る
<<Button>> <<Button.Template>> <<ControlTemplate TargetType="{x:Type Button}">> <Rectangle <[[R]]ectangle Fill="Red[[R]]ed" Width="75" Height="23"/>> <</ControlTemplate>> <</Button.Template>>
MyButton
<</Button>>
[[File:1447_wpf_template.jpg]]
===クリックでテンプレートを変更してみる===
private void Button_Click(object sender, RoutedEventArgs [[R]]outedEventArgs e)
{
var template = new ControlTemplate(typeof(Button));
*コンテンツプレゼンタを含めることでボタンらしい外観のボタンを作成できる
*コンテンツプレゼンタは規定ではテンプレートが適用されるコントロールのContentプロパティの値を表示する
<<StackPanel Name="MainPanel" Initialized="MainPanel_Initialized" >> <<StackPanel.Resources>[[R]]esources> <<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">> <<Border CornerRadiusCorner[[R]]adius="6" BorderThickness="4">> <<Border.BorderBrush>> <<LinearGradientBrush EndPoint="0,1">> <<LinearGradientBrush.GradientStops>> <<GradientStop Offset="0" Color="White"/>> <<GradientStop Offset="1" Color="Green"/>> <</LinearGradientBrush.GradientStops>> <</LinearGradientBrush>> <</Border.BorderBrush>> <<Border.Background>> <<LinearGradientBrush EndPoint="0,1">> <<LinearGradientBrush.GradientStops>> <<GradientStop Offset="0" Color="Green"/>> <<GradientStop Offset="1" Color="White"/>> <</LinearGradientBrush.GradientStops>> <</LinearGradientBrush>> <</Border.Background>> <<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"/>> <</Border>> <</ControlTemplate>> <</StackPanel.Resources>[[R]]esources> <<Button Template="{StaticResource Static[[R]]esource ButtonTemplate}" Padding="10" Margin="10">>
My Button
<</Button>> <</StackPanel>>
[[File:1449_wpf_template03.jpg]]
*例えばボタンの色を変更するためだけにテンプレートを定義する必要があるとしたら、シンプルなプログラミングモデルとは言えない。
*理想的なのはテンプレートにパラメータを追加できるか、テンプレートコントロールのプロパティをお使用して、テンプレートをカスタマイズできること。
<<blockquote>>以下の例は、BorderのBorderThicknessプロパティ、BorderBrushプロパティ、およびBackgroundプロパティをテンプレートが適用されるButtonの同じプロパティにバインドします。Buttonのプロパティを設定するだけで、下図のようなボタンを作成出来ます。<</blockquote>> <<StackPanel Name="MainPanel" Initialized="MainPanel_Initialized" >> <<StackPanel.Resources>[[R]]esources> <<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">> <<Border CornerRadiusCorner[[R]]adius="6"
BorderThickness="{TemplateBinding Property=BorderThickness}"
BorderBrush="{TemplateBinding Property=BorderBrush}"
Background="{TemplateBinding Property=Background}">> <<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"/>> <</Border>> <</ControlTemplate>> <</StackPanel.Resources>[[R]]esources> <<Button Template="{StaticResource Static[[R]]esource ButtonTemplate}"
Padding="10"
Margin="10"
BorderThickness="6"
BorderBrush="Blue">>
My Button
<</Button>> <</StackPanel>>
[[File:1450_wpf_template04.jpg]]