C# Programming

WPFXAML - レイアウトする

開発環境: Visual Studio 2008  

1.目的

XAML の基本的なコントロールの説明です。

2.参考書

(1) 参考書を書く。

3.レイアウト

コントロールをウィンドウに配置するためのコントロールとして、パネルやグリッドなど、多くのものが用意されていて、どれを使えばよいのか迷いました。そこで、クラス構造からではなく、機能でまとめてみました。

Panel派生クラスには、Canvas, DockPanel, Grid, TabPanel, ToolBarOverflowPanel, UniformGrid, StackPanel, VirtualizingPanel, WrapPanelがあります。

Controlから直接派生しているクラスには、

Controls.Decoratorから派生しているものには、Border, Viewboxがあります。

3.1 Canvas

Canvas は、Canvasの原点から子供の要素の位置を指定して配置できます。はみ出したところにも配置できます。

Canvas

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Canvas Background="Cyan" x:Name="Canvas"
Width="300" Height="200">
<Button Width="94" Height="53" Content="Button" Canvas.Left="33" Canvas.Top="39"/>
<Button Width="94" Height="53" Content="Button" Canvas.Left="353" Canvas.Top="83"/>
<Button Width="123" Height="87" Content="Button" Canvas.Left="180" Canvas.Top="120"/>
<Button Width="94" Height="53" Content="Button" Canvas.Left="284" Canvas.Top="199"/>
</Canvas>

</Page>

3.2 DockPanel

DockPanel は、Windows.Formsと同じように子要素をDockの方向を指定して配置できます。LastChildFill プロパティを true (既定) に設定すると、DockPanel の最終の子要素は常に残りの領域を満たします。

DockPanel

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<DockPanel Margin="58,44,90,76" Background="Cyan" LastChildFill="False">
<Button Content="Top" DockPanel.Dock="Top"/>
<Button Content="Right" DockPanel.Dock="Right"/>
<Button Content="Left" DockPanel.Dock="Left"/>
<Button Content="Bottom" DockPanel.Dock="Bottom"/>
<Button Content="Top" DockPanel.Dock="Top"/>
<Button Content="Right" DockPanel.Dock="Right"/>
<Button Content="Left" DockPanel.Dock="Left"/>
<Button Content="Bottom" DockPanel.Dock="Bottom"/>
<Button Content="Top" DockPanel.Dock="Top"/>
<Button Content="Right" DockPanel.Dock="Right"/>
<Button Content="Left" DockPanel.Dock="Left"/>
<Button Content="Bottom" DockPanel.Dock="Bottom"/>
</DockPanel>

</Page>

3.3 GridPanel

GridPanel は、m x nの格子状に子要素を配置できます。Gridの次元は、ColumnDefinitions, RowDefinitionsで定義します。

子要素をどのグリッドに配置するかは、1列目: Grid.Column="0"、3行目:Grid.Row="2"のように、指定します。

XAML

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Grid Margin="39,53,41,41" x:Name="Grid" Width="515" Height="347" Background="#FF0EEFFB">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.238*"/>
<ColumnDefinition Width="0.392*"/>
<ColumnDefinition Width="0.198*"/>
<ColumnDefinition Width="0.172*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.231*"/>
<RowDefinition Height="0.233*"/>
<RowDefinition Height="0.4*"/>
</Grid.RowDefinitions>
<TextBox Grid.Column="0" Grid.Row="0" Text="Grid.Column=&quot;0&quot; Grid.Row=&quot;0&quot;" TextWrapping="Wrap"/>
<TextBox Grid.Column="1" Grid.Row="1" Text="Grid.Column=1 Grid.Row=1" TextWrapping="Wrap"/>
<TextBox Grid.Column="0" Grid.Row="2" Text="Grid.Column=1 Grid.Row=2" TextWrapping="Wrap"/>
<TextBox Grid.Column="2" Grid.Row="2" Text="Grid.Column=2 Grid.Row=2" TextWrapping="Wrap"/>
<TextBox Grid.Column="2" Grid.Row="0" Text="Grid.Column=2 Grid.Row=0" TextWrapping="Wrap"/>
<TextBox Grid.Column="3" Grid.Row="1" Text="Grid.Column=2 Grid.Row=0" TextWrapping="Wrap"/>
</Grid>

</Page>

 

3.4 StackPanel

StackPanelは、縦または横に子要素を配置することができます。ただし、StackPanel を超える子要素を配置しても折り返してくれません。

XAML

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<WrapPanel>
<StackPanel HorizontalAlignment="Left" Width="200" Height="200" Margin="10,10,10,10" Background="Cyan">
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
</StackPanel>

<StackPanel Background="Cyan" HorizontalAlignment="Right" Margin="10,10,10,10" Width="200" Height="200" Orientation="Horizontal">
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
</StackPanel>
</WrapPanel>

</Page>

縦に並べるには、Orientation="Horizontal"を指定します。

 

3.5 WrapPanel

WrapPanel は、左から右に子要素を配置しますが、右端で自動的に折り返してくれます。

XAML

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<WrapPanel>
<WrapPanel Margin="10,10,10,10" Background="Cyan">
<Button Width="58.127" Content="Button"/>
<Button Width="98.127" Content="Button"/>
<Button Width="132.127" Content="Button"/>
<Button Content="Button"/>
<Button Width="136.127" Content="Button" Height="59"/>
<Button Width="188.127" Content="Button" Height="24"/>
<Button Width="288.127" Content="Button" Height="24"/>
</WrapPanel>

<WrapPanel Margin="10,10,10,10" Background="Cyan" HorizontalAlignment="Right" Orientation="Vertical">
<Button Width="40" Content="Button" Height="100"/>
<Button Width="40" Content="Button" Height="100"/>
<Button Content="Button" Width="40" Height="165"/>
<Button Width="80.127" Content="Button" Height="69"/>
<Button Width="40" Content="Button" Height="149"/>
<Button Width="40" Content="Button" Height="115"/>
</WrapPanel>

</WrapPanel>

</Page>

上から下に並べるには、Orientation="Vertical"を指定します。

3.6 ScrollViewer

ScrollViewer は、子要素をスクロール可能なビューアーです。ただし、子要素は1つしか持てません。

XAML

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<ScrollViewer Background="Cyan" HorizontalScrollBarVisibility="Auto">
<StackPanel >
<TextBox Text="ScrollViewer > StackPanel > TextBox + Ellipse" TextWrapping="Wrap"/>
<Ellipse Fill="Yellow" Stroke="Blue" Width="600" Height="400"/>
</StackPanel>
</ScrollViewer>

</Page>

3.7 Border

Borderは、周囲に境界線、背景、またはその両方を描画します。ただし、子要素は1つしか持てません。

XAML

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Border Margin="10,10,10,10" Background="Cyan">
<StackPanel >
<TextBox Text="Border > StackPanel > TextBox + Ellipse" TextWrapping="Wrap"/>
<Ellipse Fill="Yellow" Stroke="Red" Width="400" Height="300"/>
</StackPanel>
</Border>

</Page>

 

3.8 UniformGrid

UniformGridは、次のように子要素をm x n で等分してレイアウトすることができます。

XAML

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<WrapPanel>

<UniformGrid HorizontalAlignment="Left" Margin="10,10,10,10" Width="202" Background="Cyan" Columns="3" Rows="3">
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
</UniformGrid>

<UniformGrid Width="202" Background="Cyan" Columns="4" Rows="2" Height="219" HorizontalAlignment="Right" Margin="10,10,10,10">
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
</UniformGrid>
</WrapPanel>

</Page>

3.9 ViewBox

子要素を伸縮、スケーリングを実行することができます。ただし、子要素は1つしか持てません。

XAML

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Page.Resources>
<ImageBrush x:Key="Brush1" ImageSource="WZero3 015.jpg"/>
</Page.Resources>

<WrapPanel>

<Viewbox Margin="30,30,30,30" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" Width="150" VerticalAlignment="Top" Height="130">
<Rectangle Fill="{DynamicResource Brush1}" Stroke="#FF000000" Width="232" Height="187"/>
</Viewbox>
</WrapPanel>

</Page>

ViewBoxでは、Stretch="Fill"とすることにより、コンテンツをViewBoxのサイズに応じて引き延ばすことができます。

また、ここで Page.Resources により ImageBrushを指定していますがこれは Page の場合で、Windows アプリケーションの場合は、Windows.Resources になります。

XAML

 

4. 回転、拡縮、スキュー、スケーリング

パネルなどの回転、拡縮、スキュー、スケーリングを行うには、RenderTransform を使用します。

XAML

Expression Blenであれば、次のペインでRenderTransformの設定を変更することができます。

平行移動
<TranslateTransform X="0" Y="0"/>

XAML Blend

回転
<RotateTransform Angle="0"/>

XAML

拡大縮小
<ScaleTransform ScaleX="1" ScaleY="1"/>

XAML

スキュー(傾き)
<SkewTransform AngleX="0" AngleY="0"/>

XAML

回転などのときの中心点
RenderTransformOrigin="0.6,0.5"

XAML

反転
<ScaleTransform ScaleX="-1" ScaleY="-1"/>

XAML

RenderTransformには、TransformGroupとして、ScaleTransform, SkewTransform, RotateTransform, TranslateTransform を指定することができます。上記の例であれば、つぎのようになります。

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Page.Resources>
<ImageBrush x:Key="Brush1" ImageSource="WZero3 015.jpg"/>
</Page.Resources>

<WrapPanel>


<Viewbox Margin="30,30,30,30" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" Width="150" VerticalAlignment="Top" Height="130">
<Rectangle Fill="{DynamicResource Brush1}" Stroke="#FF000000" Width="232" Height="187"/>
</Viewbox>

<Viewbox Margin="30,30,30,30" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Top" Height="130">
<Viewbox.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="-20"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Viewbox.RenderTransform>
<Rectangle Fill="{DynamicResource Brush1}" Stroke="#FF000000" Width="232" Height="187"/>
</Viewbox>

<Viewbox Margin="30,30,30,30" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Right" VerticalAlignment="Top" Width="150" Height="130">
<Viewbox.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="-20" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Viewbox.RenderTransform>
<Rectangle Fill="{DynamicResource Brush1}" Stroke="#FF000000" Width="232" Height="187"/>
</Viewbox>

<Viewbox Margin="30,30,30,30" RenderTransformOrigin="0.45,0.7" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="150" Height="130">
<Viewbox.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.35" ScaleY="0.6"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Viewbox.RenderTransform>
<Rectangle Fill="{DynamicResource Brush1}" Stroke="#FF000000" Width="232" Height="187"/>
</Viewbox>

<Viewbox Margin="30,30,30,30" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="150" Height="130">
<Viewbox.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="-1" ScaleY="-1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Viewbox.RenderTransform>
<Rectangle Fill="{DynamicResource Brush1}" Stroke="#FF000000" Width="232" Height="187"/>
</Viewbox>
</WrapPanel>

</Page>