WPFには、FrameworkElementというWPFのコントロールが継承しているクラスがある。継承階層的には結構上だったりする。このFrameworkElementにあるプロパティに、LayoutTransformとRenderTransformというのがある。これを使うと、本来ある位置から、コントロールを回転させたり拡大したり移動させたりすることが出来る。
LayoutTransformは、レイアウトに影響を与えることが出来る。LayoutTransformで拡大したり、回転させたりした結果の座標と大きさを元にWPFのレイアウトシステムが位置を決めてくれる。RenderTransformは、レイアウトシステムには関係なく、サイズを変えたり回転させたりする。両者の違いを見るために簡単にサンプルをこさえてみた。
GridにHeightがAutoの行を3つ追加して、各々にボタンを配置した。変換の1つであるScaleTransformを使って2倍サイズにしてある。1つはLayoutTransform、1つはRenderTransform、最後の1つは何もしてない通常のボタンになってる。
<Window x:Class="WpfTransformSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="285" Width="792">
<Grid ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button Grid.Row="0" Content="LayoutTransform">
<Button.LayoutTransform>
<ScaleTransform ScaleX="2" ScaleY="2" />
</Button.LayoutTransform>
</Button>
<Button Grid.Row="1" Content="RenderTransform">
<Button.RenderTransform>
<ScaleTransform ScaleX="2" ScaleY="2" />
</Button.RenderTransform>
</Button>
<Button Grid.Row="2" Content="むぢるし" />
</Grid>
</Window>
実行すると下のようになる。LayoutTransformは、巨大化した後の状態でGridの中にきれいに納まってる。RenderTransformは、Gridの中からはみ出して3つ目のボタンの部分にはみ出しているのが見て取れると思う。
ちなみに、ScaleTransformが倍率を変えることができて、
プレゼン時に使える
勉強会で、中さんがでっかいボタンやラジオボタンとかを持ったWPFのウィンドウを表示させてたりするけど、多分これを使ってやってるはずだ。Windowの方に記述しないでボタンのサイズとかを変えるにはスタイルを使うのが一番。ということで、こういうスタイルをApp.xamlあたりに登録しておくとGOOD。
<Application x:Class="WpfTransformSample.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<!-- 倍のサイズにしますよ -->
<ScaleTransform x:Key="Scale" ScaleX="2" ScaleY="2" />
<!-- FrameworkElementのスタイルとして定義 -->
<Style x:Key="BaseStyle" TargetType="{x:Type FrameworkElement}">
<Setter Property="LayoutTransform" Value="{StaticResource Scale}"/>
</Style>
<!-- でっかくしたいコントロールの数だけ定義する -->
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseStyle}" />
<Style TargetType="{x:Type RadioButton}" BasedOn="{StaticResource BaseStyle}" />
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource BaseStyle}" />
</Application.Resources>
</Application>
こういう感じでスタイルを定義しておくと、ウィンドウのほうではコントロールを普通に使うだけで、でっかくなる。
<Window x:Class="WpfTransformSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="265" Width="364">
<StackPanel>
<Button Content="Click" />
<RadioButton Content="男" />
<RadioButton Content="女" />
<TextBox Text="Hello world" />
</StackPanel>
</Window>
実行すると、サイズが倍になったコントロールが表示される。プレゼンで画面に出すとき便利だぜ。