WPFグリッド列の表示を切り替える方法
-
10-07-2019 - |
質問
作業中のWPFアプリでこれを機能させるのに問題があります。基本的に、私が望んでいるのはMMCのタスクペインのようなものです:
- アプリの画面の主要部分には3つの列があります。右側にサイズ変更可能な列が必要です。これは、GridSplitterでGridを使用することを意味すると思いますが、動作するものなら何でもかまいません。
- アプリを閉じたときに右側の列の幅を保存し、アプリを開いたときに読み込むことができるようにしたいのですが、これは初期サイズである必要があります。ユーザーはサイズを変更できます。
- ウィンドウのサイズを変更するとき、左側と右側の列は同じサイズのままにし、中央の列はウィンドウの幅に合わせてサイズを変更します。
- 左側と右側の列には最小の幅が必要です。右側の列のサイズを変更するとき、中央の列は小さくなりますが、左側の列は小さくなりません。
- また、右側の列の可視性を、列の外側にあるトグルボタンで切り替えて、可視性に戻ったときに、前と同じ幅にしたいです
XAMLとバインディングを可能な限り使用しようとしています。
そして、クリーム、アイスクリーム、チョコレートチップをトッピングしてもらえますか? :-)
解決
要件を読むとき、 Grid
を考える代わりに、 DockPanel
を考えます。
<DockPanel>
<Grid Name="right"
DockPanel.Dock="Right" MinWidth="100" />
<Grid Name="Left"
DockPanel.Dock="Left" MinWidth="100" />
<Grid Name="middle" />
</DockPanel>
right
のサイズを変更する場合、 right
のサイズが変更されると、 middle
が変更されます。ウィンドウのサイズを変更すると、 middle
のみが変更されます。 right
の Width
を保存して設定するのはあなた次第ですが、難しくはないはずです。
ユーザーが right
のサイズを変更できるようにすることは少し面倒ですが、この記事が役立ちます。 この他の記事はさらに役立ちます。
right
を表示するには、 Visibility
を Collapsed
に設定して、非表示にし、に設定して復元します。表示
。
注:内部のパネルは Grid
である必要はありませんが、それぞれに何らかの Panel
を使用する必要があります。現在の Grid
列内にあるものは何でも問題なく動作するはずです。
他のヒント
GridSplittersでGridを使用しました。これにより、左右の列の幅を維持しながら中央の列のサイズを簡単に変更できるようになりました。
XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MainWindow"
Title="Main Window"
Width="640" Height="480">
<Grid>
<Grid.ColumnDefinitions>
<!-- Left column -->
<ColumnDefinition Width="200" MinWidth="100"/>
<!-- Left GridSplitter column -->
<ColumnDefinition Width="5"/>
<!-- Center column. A width of * means the column will fill
any remaining space. -->
<ColumnDefinition Width="*"/>
<!-- Right GridSplitter column -->
<ColumnDefinition x:Name="RightSplitterColumn" Width="5"/>
<!-- Right column -->
<ColumnDefinition x:Name="RightColumn" Width="200"
MinWidth="100"/>
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
<GridSplitter Grid.Column="3" HorizontalAlignment="Stretch" />
<Button x:Name="ToggleButton" Grid.Column="2"
Content="Toggle Right Column" Width="150" Height="25"
Click="ToggleButton_Click" />
</Grid>
</Window>
コードビハインド
右側の列を非表示にする場合、グリッド列には可視性プロパティがないため、列幅を0に設定します。
public partial class MainWindow : Window
{
private double rightColumnWidth;
private double rightColumnMinWidth;
private bool rightColumnHidden;
public MainWindow()
{
this.InitializeComponent();
}
private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
if (rightColumnHidden)
{
// Restore the widths.
RightColumn.MinWidth = rightColumnMinWidth;
RightColumn.Width = new GridLength(rightColumnWidth);
RightSplitterColumn.Width = new GridLength(5);
}
else
{
// Remember the user-set widths for the columns.
rightColumnWidth = RightColumn.Width.Value;
rightColumnMinWidth = RightColumn.MinWidth;
// Remember to set the minimum width to 0 before changing the actual
// width.
RightColumn.MinWidth = 0;
RightColumn.Width = new GridLength(0);
RightSplitterColumn.Width = new GridLength(0);
}
rightColumnHidden = !rightColumnHidden;
}
}
起動時に列幅を保存および復元するには、幅変数を設定ファイルに保存し、アプリを再度開いたときにそれらを適用します。
columndefinition WidthをAutoに設定し、その列内にコントロールを配置して、他の列にスターを付けます。コンテンツを含む列を非表示にする場合は、control.Visibility = Collapsedを設定します。列幅は自動であるため、その列は表示されず、残りの列にはスペースが必要になります。
3年後、CodeProjectで別のアプローチを見つけることができます。
http://www.codeproject.com/ Articles / 437237 / WPF-Grid-Column-and-Row-Hiding
「表示」を追加します;プロパティをカスタム列定義に追加します。