如何切换WPF网格列可见性

时间:2009-08-02 07:17:22

标签: wpf binding grid gridsplitter togglebutton

我在使用WPF应用程序时遇到了一些麻烦。基本上,我所追求的是像MMC中的任务窗格:

  • 该应用在显示屏的主要部分有三列。我需要右侧的一个可调整大小的列。我认为这意味着使用带有GridSplitter的Grid,但任何有效的东西都可以。
  • 我希望能够在关闭应用时保存右侧列的宽度,并在应用程序打开时加载它但是这应该是初始大小:用户应该能够调整它的大小。
  • 当我调整窗口大小时,我希望左侧和右侧列保持相同的大小,而中间列则调整窗口宽度。
  • 左侧和右侧列需要具有最小宽度。当我调整右侧列的大小时,我希望中心列变小但不是左侧列。
  • 我还希望能够使用位于列外的切换按钮切换右侧列的可见性,当它返回到可见性时,我希望它与之前的宽度相同。

我正在尝试尽可能多地在XAML中进行绑定。

请问我能吃上奶油,冰淇淋和巧克力片吗? : - )

4 个答案:

答案 0 :(得分:17)

在我阅读您的要求时,我想到的是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的{​​{1}}取决于您,但不应该很难。

至于允许用户调整right的大小,这会有点棘手,但我发现this article应该有所帮助。 This other article可能会有所帮助。

要获得right的可见性,您可以将其right设置为Visibility以隐藏它,并通过将其设置为Collapsed来恢复它。

注意:里面的面板不一定是Visible,但你需要为每个面板使用某种Grid。无论您在当前Panel列中拥有什么,都应该可以正常工作。

答案 1 :(得分:8)

我使用Grid with 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>

<强>代码隐藏

隐藏右列时,我只是将列宽设置为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;
    }
}

至于在启动时保存和恢复列宽,我只是将宽度变量存储到设置文件中,然后在重新打开应用程序时应用它们。

答案 2 :(得分:4)

将columndefinition Width设置为Auto并将控件放在该列中,并为其他列提供Star。每当您想要隐藏包含内容的列时,请设置control.Visibility = Collapsed,并且由于列宽为Auto,您将看不到该列,其余列将占用空间。

答案 3 :(得分:4)

3年后,您可以在CodeProject上找到另一种方法。

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

它为自定义列定义添加了“可见”属性。