コントロールのデザインは通常XAMLで行うが、コードで作り込む事も出来る。
Templateの中身をコードで作成する場合、各コントロールクラスではなくFrameworkElementFactoryクラスを使ってコントロールを作り込んでいく。
XAMLで作った場合
以下はXAMLでTemplateを使っている例
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="250" Width="250">
<Canvas Margin="10" Background="AliceBlue">
<Thumb x:Name="test" Width="50" Height="50"
Canvas.Left="0"
Canvas.Top="0">
<Thumb.Template>
<ControlTemplate>
<Border BorderBrush="Red" BorderThickness="1">
<Image Source="testimage.jpg"/>
</Border>
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Canvas>
</Window>
コードで作った場合
上記の例のTemplateの部分をWindowのLoadedイベント内でコードから作成する。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="250" Width="250">
<Canvas Margin="10" Background="AliceBlue">
<Thumb x:Name="test" Width="50" Height="50"
Canvas.Left="0"
Canvas.Top="0">
</Thumb>
</Canvas>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var image = new FrameworkElementFactory(typeof(Image));
image.SetValue(Image.SourceProperty, new BitmapImage(new Uri("c:\\testimage.jpg", UriKind.Absolute)));
var border = new FrameworkElementFactory(typeof(Border));
border.SetValue(Border.BorderBrushProperty, new SolidColorBrush(Colors.Red));
border.SetValue(Border.BorderThicknessProperty, new Thickness(1));
border.AppendChild(image);
var template = new ControlTemplate(typeof(Thumb));
template.VisualTree = border;
test.Template = template;
}
}
Imageコントロールを作成 (10~11行目)
FrameworkElementFactoryをImage型で作成。
SetValueメソッドでSourceプロパティにBitmapImageをセットする。
Borderコントロールを作成 (13~16行目)
FrameworkElementFactoryをBorder型で作成。
SetValueメソッドでそれぞれのプロパティに値をセットする。
AppendChildメソッドで、作成したImageコントロールを子要素として登録する。
ControlTemplateを作成 (18~19行目)
ControlTemplateを作成。
VisualTreeプロパティへ作成したBorderコントロールをセットする。
Templateへセット (18~19行目)
ThumbコントロールのTemplateへ作成したControlTemplateをセットする。

コメント
コメントを投稿