Как переключить видимость столбца WPF Grid - PullRequest
15 голосов
/ 02 августа 2009

У меня возникли проблемы с тем, чтобы заставить его работать в приложении WPF, над которым я работаю. По сути, мне нужно что-то вроде панели задач в MMC:

  • Приложение имеет три столбца в основной части экрана. Мне нужен столбец на правой стороне, который можно изменить. Я предполагаю, что это означает использование Grid с GridSplitter, но все, что работает, подойдет.
  • Я хочу иметь возможность сохранить ширину правого столбца, когда приложение закрыто, и загрузить его, когда приложение открыто, но это должен быть начальный размер: пользователь должен иметь возможность изменить его размер.
  • Когда я изменяю размер окна, я хочу, чтобы левый и правый столбцы оставались одинакового размера, а средний столбец - с шириной окна.
  • Левая и правая колонки должны иметь минимальную ширину. Когда я изменяю размер правой колонки, я хочу, чтобы центральная колонка стала меньше, но не левой колонки.
  • Я также хочу иметь возможность переключать видимость правого столбца с помощью переключателя, который находится за пределами столбца, и когда он вернется к видимости, я хочу, чтобы он был такой же ширины, как и раньше.

Я пытаюсь сделать как можно больше в XAML и с привязкой.

А можно мне его положить со сливками, мороженым и шоколадной крошкой, пожалуйста? : -)

Ответы [ 4 ]

17 голосов
/ 12 августа 2009

Когда я читаю ваши требования, вместо 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 столбцов, должно работать нормально.

8 голосов
/ 15 августа 2009

Я использовал 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;
    }
}

Что касается сохранения и восстановления ширины столбцов при запуске, я бы просто сохранил переменные ширины в файле настроек и затем применил их при повторном открытии приложения.

4 голосов
/ 08 июля 2013

3 года спустя вы можете найти другой подход на CodeProject.

http://www.codeproject.com/Articles/437237/WPF-Grid-Column-and-Row-Hiding

Добавляет свойство «Видимый» в пользовательские определения столбцов.

4 голосов
/ 02 августа 2009

Установите для столбца Определение ширины значение Авто, поместите элемент управления в этот столбец и задайте звездочку для других столбцов. Всякий раз, когда вы хотите скрыть столбец с содержимым, установите control.Visibility = Collapsed, и поскольку для ширины столбца установлено значение Auto, этот столбец не будет отображаться, а оставшиеся столбцы будут занимать пространство.

...