2009-08-02 3 views
14

У меня возникли проблемы с тем, чтобы это работало в приложении WPF, над которым я работаю. В принципе, то, что мне нужно, похоже на панель задач в MMC:Как переключить видимость столбца таблицы WPF

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

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

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

+0

Я отредактировал оригинальный вопрос довольно сильно, потому что мой оригинал был таким же ясным, как грязь. – serialhobbyist

+0

Моя вторая щедрость за десять минут. Поскольку я еще не закончил, я не совсем уверен, что произойдет. Думаю, мы увидим ... – serialhobbyist

+0

Если вы не выбрали один из самых высоких голосов, он автоматически получает его –

ответ

16

Как я читал ваши требования, вместо того, чтобы думать о 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. Хранение и установка Widthright зависит от вас, но не должно быть трудно.

Что касается разрешения пользователя на изменение размера right, это будет немного сложнее, но я нашел this article, который должен помочь. может помочь еще больше.

Для наглядности right, вы можете установить его Visibility в Collapsed, чтобы скрыть его и восстановить его, установив его в Visible.

Примечание: Панели внутри не обязательно должны быть Grid, но вы хотите использовать какой-то Panel для каждого. Независимо от того, что у вас внутри, текущие колонки Grid должны работать нормально.

+0

Я использовал ваш подход и статьи, которые вы предлагали, и это работает как шарм. Я связываю свойства Видимости как содержимого, так и сплиттера с кнопкой переключения, и все работает так, как планировалось. Большое спасибо за вашу помощь. – serialhobbyist

+0

Добро пожаловать. –

4

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

+0

Я не могу заставить это работать с желаемым поведением. Установка Width to Auto означает, что изменение размера окна влияет на столбцы в том, что кажется пользователю нечувствительным. – serialhobbyist

7

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

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

+0

Спасибо за предложение: он действительно достиг чего-то, чего я хотел, поэтому я «поднял» его, но я думаю, что такого рода вещи лучше делать в XAML со всеми возможными связями. Я принял ответ Джоэля, потому что он ближе к этому подходу. Еще раз спасибо за вашу работу. – serialhobbyist

 Смежные вопросы

  • Нет связанных вопросов^_^