Как переключить видимость столбца WPF Grid
У меня возникли проблемы с тем, чтобы заставить это работать в приложении WPF, над которым я работаю. По сути, мне нужно что-то вроде панели задач в MMC:
- Приложение имеет три столбца в основной части дисплея. Мне нужен столбец с правой стороны, который можно изменить. Я предполагаю, что это означает использование Grid с GridSplitter, но все, что работает, подойдет.
- Я хочу иметь возможность сохранить ширину правого столбца, когда приложение закрыто, и загрузить его, когда приложение открыто, но это должен быть начальный размер: пользователь должен иметь возможность изменить его размер.
- Когда я изменяю размер окна, я хочу, чтобы левый и правый столбцы оставались одинакового размера, а средний столбец изменялся с шириной окна.
- Левый и правый столбцы должны иметь минимальную ширину. Когда я изменяю размер правой колонки, я хочу, чтобы центральная колонка стала меньше, но не левой колонки.
- Я также хочу иметь возможность переключать видимость правого столбца с помощью переключателя, который находится за пределами столбца, и когда он вернется к видимости, я хочу, чтобы он был такой же ширины, как и раньше.
Я пытаюсь сделать как можно больше в XAML и с привязкой.
А можно мне его положить со сливками, мороженым и шоколадной крошкой, пожалуйста?:-)
4 ответа
Пока я читаю ваши требования, вместо того, чтобы думать о Grid
Я думаю о DockPanel
,
<DockPanel>
<Grid Name="right"
DockPanel.Dock="Right" MinWidth="100" />
<Grid Name="Left"
DockPanel.Dock="Left" MinWidth="100" />
<Grid Name="middle" />
</DockPanel>
Если вы делаете способ изменить размер right
, затем middle
будет меняться как right
изменен Если вы измените размер окна, только middle
изменится. Хранение и настройка Width
из right
зависит от вас, но не должно быть трудно.
Что касается разрешения пользователю изменять размер right
Это будет немного сложнее, но я нашел эту статью, которая должна помочь. Эта другая статья может помочь еще больше.
Для наглядности right
Вы можете установить его Visibility
в Collapsed
чтобы скрыть и восстановить его, установив его Visible
,
Примечание: панели внутри не должны быть Grid
с, но вы хотите использовать какой-то Panel
для каждого. Все, что у вас есть внутри вашего текущего Grid
столбцы должны работать просто отлично.
Я использовал Grid с GridSplitters, поскольку это позволило очень легко изменить размер среднего столбца, сохраняя ширину левого и правого столбцов.
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>
Code-Behind
При скрытии правого столбца я просто устанавливаю ширину столбца равной 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;
}
}
Что касается сохранения и восстановления ширины столбцов при запуске, я бы просто сохранил переменные ширины в файле настроек и затем применил их при повторном открытии приложения.
Установите для столбца Определение ширины значение Авто, поместите элемент управления в этот столбец и задайте звездочку для других столбцов. Всякий раз, когда вы хотите скрыть столбец с содержимым, установите control.Visibility=Collapsed, и поскольку ширина столбца равна Auto, этот столбец не будет отображаться, а оставшиеся столбцы будут занимать пространство.
Спустя 3 года вы можете найти другой подход на CodeProject.
http://www.codeproject.com/Articles/437237/WPF-Grid-Column-and-Row-Hiding
Он добавляет свойство "Видимый" в пользовательские определения столбцов.