none
Сворачиваемые элементы приложения, как? RRS feed

  • Вопрос

  • Есть приложение , макет которого верстается при помощи Grid (WPF). Как сделать так, чтобы при нажатии на кнопку можно было скрыть какой-либо столбец из грида со всем его контентом? Действие наподобие удаления столбца в Excel'e со сдвигом влево/вправо оставшейся части.

    Вариант с присвоением свойству IsVisible=false все элементам в скрываемом столбце не удобен , ибо элементов много. Есть ли какой-то простой и эффективный сие действо осуществить?

    13 сентября 2011 г. 6:24

Ответы

  • Прошу прощения, привел примеор для DataGrid'а.

    Для грида это выглядит так.

    Разметка:

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Name="HidableCollumn" Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button Content="Button" Grid.Column="2" Name="button1" Click="button1_Click" />        
        </Grid>
    


    По нажатию на кнопку, просто сделать Width равным нулю:

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                this.HidableCollumn.Width = new GridLength(0);
            }
    


    • Помечено в качестве ответа Dottz 21 сентября 2011 г. 12:07
    21 сентября 2011 г. 7:06
    Модератор

Все ответы

  • dataGridName.Columns[columnId].Visibility = System.Windows.Visibility.Hidden;
    //Или
    dataGridName.Columns[columnId].Visibility = System.Windows.Visibility.Collapsed;
    
    

    • Помечено в качестве ответа Abolmasov Dmitry 13 сентября 2011 г. 13:33
    • Снята пометка об ответе ulcerModerator 21 сентября 2011 г. 7:03
    13 сентября 2011 г. 6:39
    Модератор
  • Я использую компонент Grid , в нем нет определения Columns, есть только коллекция ColumnsDefinitions, у элементов которой отсутствует какое-либо свойство, отвечающее за видимость.

    P.s. Извините за такой долгий отклик на сообщение, решались другие задачи.

    21 сентября 2011 г. 6:39
  • Вариант с присвоением свойству IsVisible=false все элементам в скрываемом столбце не удобен , ибо элементов много. Есть ли какой-то простой и эффективный сие действо осуществить?

    А если положить все элементы в один какой-нибудь контейнер и изменять его свойство IsVisible. При это ширина столбца Grid-а должна быть Auto или *.

    Также посмотрите обсуждения на stackoverflow - WPF Hide Grid Column, WPF: Hide grid row, How to toggle a WPF Grid column visibility.


    Для связи [mail]
    21 сентября 2011 г. 7:03
  • Прошу прощения, привел примеор для DataGrid'а.

    Для грида это выглядит так.

    Разметка:

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Name="HidableCollumn" Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button Content="Button" Grid.Column="2" Name="button1" Click="button1_Click" />        
        </Grid>
    


    По нажатию на кнопку, просто сделать Width равным нулю:

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                this.HidableCollumn.Width = new GridLength(0);
            }
    


    • Помечено в качестве ответа Dottz 21 сентября 2011 г. 12:07
    21 сентября 2011 г. 7:06
    Модератор
  • Ответ по сути уже дан, но добавлю, что вариант Дмитрия хорош, когда вам не нужен фиксированный размер, а подойдет Auto, а вариант ulcer хорош в обратном случае. Я в своих приложениях использую оба (в зависимости от того что в данном месте удобнее)
    21 сентября 2011 г. 7:21
    Отвечающий
  • В моем случае значения Width фиксированные, поэтому вариант Ulcer больше подходит. Но тут дополнительный момент: при обратном разворачивании нужно же прежнюю ширину столбца обратно вернуть, это надо значит все значения Width столбцов дополнительно где-то хранить...
    21 сентября 2011 г. 12:10
  •  public partial class MainWindow : Window
        {
            GridLength baseColumnWidth;
            public MainWindow()
            {
                InitializeComponent();
                baseColumnWidth = this.HidableCollumn.Width;
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                if (this.HidableCollumn.Width.Value == 0)
                {
                    this.HidableCollumn.Width = baseColumnWidth;
                }
                else
                {
                    this.HidableCollumn.Width = new GridLength(0);
                }
            }
        }
    

    21 сентября 2011 г. 13:25
    Модератор