コントロールのデザインは通常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をセットする。
コメントをお書きください