15

我无法在我正在开发的 WPF 应用程序中使用它。基本上,我所追求的是类似于 MMC 中的任务窗格:

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

我试图在 XAML 和绑定中做尽可能多的事情。

我可以在上面放奶油、冰淇淋和巧克力片吗?:-)

4

4 回答 4

17

当我阅读您的要求时,我没有想到 a Grid,而是想到了 a 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改变。存储和设置Widthofright取决于您,但应该不难。

至于允许用户调整大小right,这会有点棘手,但我发现这篇文章应该有所帮助。这篇其他文章可能会有所帮助。

对于 的可见性right,您可以将其设置VisibilityCollapsed隐藏它并通过将其设置为来恢复它Visible

注意:里面的面板不必是s,但你会想要为每个面板Grid使用某种类型。Panel您当前Grid列中的任何内容都应该可以正常工作。

于 2009-08-12T16:41:21.683 回答
8

我使用了 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>

代码隐藏

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

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

于 2009-08-15T03:23:38.863 回答
4

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

于 2009-08-02T07:26:01.067 回答
4

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

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

它将“可见”属性添加到自定义列定义。

于 2013-07-08T11:16:46.593 回答