我在使用WPF应用程序时遇到了一些麻烦。基本上,我所追求的是像MMC中的任务窗格:
我正在尝试尽可能多地在XAML中进行绑定。
请问我能吃上奶油,冰淇淋和巧克力片吗? : - )
答案 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
它为自定义列定义添加了“可见”属性。