2012年6月8日金曜日

WPFでスクロールバーを付ける

初歩的なことだけど使う機会がなく知らなかったので備忘録。

WPFではコントロールのサイズは動的に決定されるのが望ましい。例えば多言語対応を行った場合、日本語と英語とでは表記の長さが異なり、日本語用にサイズを固定化すると、英語化した際にはみ出たりする。あるいはファイル、DB、ネットワークに依存する値などは事前に固定化するのが難しい。

ということでSystem.Windows.WindowのSizeToContentプロパティをWidthAndHeightに設定することを自分はよくやる。Width/Heightは大体Auto。MinWidthやMaxWidthなども指定しない。こうするとウィンドウの内容は0x0まで小さくできる。

800x600を切るようなサイズまで小さくしたとき、全てのコントロールがウィンドウに収まるとは限らない。この場合、スクロールバーを実装していないと一部コントロールはウィンドウ外にはみ出てしまう。「最大化すりゃ最近の画面サイズなら収まるだろうからいいじゃん」て意見もあるかもしれないが小さいサイズにして画面端に待機させておきたいことはままある。

前置きが長くなったけどWPFには標準でScrollBarとScrollViewerというコントロールが用意されている。 ScrollViewerはScrollBarをラップ・拡張しており、上記のようなニーズにはScrollViewerを使うことになる。 使い方はスクロールバーを付けたいレイアウトコントロールを丸ごとScrollViewerの子要素にしてやる。

デフォルトでは縦方向のスクロールバーだけが表示される。 これはHorizontalScrollBarVisibilityプロパティの規定値がHiddenになっているからだ。この値はSystem.Windows.Controls.ScrollBarVisibilityを見れば分かるように4種類あるが、基本的にAutoでいいだろう。VerticalScrollBarVisibilityについても同様に設定する。

XAMLでいうとこんな感じ
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" SizeToContent="WidthAndHeight">
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <!-- 分かりやすいようにMarginをでかくする -->
            <Label Content="設定値1" Margin="30" />
            <TextBox Width="300" Grid.Column="1" Margin="30" />
            <Label Content="設定値2" Grid.Row="1" Margin="30" />
            <TextBox Width="300" Grid.Row="1" Grid.Column="1" Margin="30" />
        </Grid>
    </ScrollViewer>
</Window>

0 件のコメント:

コメントを投稿