你能建议一种在 wpf 中在水平和垂直拆分之间切换的好方法吗?我的界面中有两个区域。希望它们被可拖动的分隔符分开,并有一个按钮在 horisontal 和垂直拆分之间切换。我试图用AvalonDock做到这一点,但由于某种原因没有奏效。这是我的问题,还没有人回答。上一个问题
也许是另一个库,或者使用标准 GridSplitter 执行此操作的简单方法?
我刚刚遇到了类似的问题。这是我解决它的方法,这要归功于这里的一些好主意:
<ContentControl>
<ContentControl.Resources>
<BoolConverter x:Key="BoolToLayoutConverter" TrueValue="templateHorizontal" FalseValue="templateVertical"/>
<BoolConverter x:Key="BoolToLayoutCharacterConverter" TrueValue="—" FalseValue="|"/>
<DataTemplate x:Key="mainTable">
<StackPanel>
<Label Content="MainTable goes here"/>
<ToggleButton Content="{Binding LayoutHorizontal, Converter={StaticResource BoolToLayoutCharacterConverter}}"
IsChecked="{Binding LayoutHorizontal}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="childTables">
<Label Content="ChildTables go here"/>
</DataTemplate>
</ContentControl.Resources>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding LayoutHorizontal}" Value="False">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="10"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" ContentTemplate="{StaticResource mainTable}"/>
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<ContentPresenter Grid.Column="2" ContentTemplate="{StaticResource childTables}"/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding LayoutHorizontal}" Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="5"/>
<RowDefinition/>
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="0" ContentTemplate="{StaticResource mainTable}"/>
<GridSplitter Grid.Row="1" Height="10" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
<ContentPresenter Grid.Row="2" ContentTemplate="{StaticResource childTables}"/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
其中 BoolConverter 是一个 IValueConverter。以及背后的代码:
private bool _layoutHorizontal = true;
public bool LayoutHorizontal
{
get { return _layoutHorizontal; }
set
{
_layoutHorizontal = value;
NotifyPropertyChanged();
}
}
有任何相当干净的方法来在运行时重新定义网格的网格行和列。您将需要一些代码来重新定义 RowDefinition 和 ColumnDefinitions,并可能更新网格子项的 Grid.Row 和 Grid.Column 附加属性。我不确定网格对这种重新配置的反应如何。您可能需要手动使某些内容失效。我怀疑您尝试使用的库没有实现重新配置网格所需的所有步骤,或者他们尝试并发现它不起作用。
但是,将一个预配置的网格换成另一个网格应该相对简单。将两个网格放在同一个位置,并将当前未使用的网格的可见性设置为折叠。