当我将GridSplitter向左拖动时,下面的XAML会将元素推出窗口。 如何将所有元素保留在窗口框架内?
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="0" />
<Button Grid.Column="1" Content="1" />
<Button Grid.Column="2" Content="2" />
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Left" />
</Grid>
由于
答案 0 :(得分:5)
我知道解决问题的唯一方法是让你的gridsplitter左右列的width属性设置为Width="*"
,并为GridSplitter提供自己的列,其HorizontalAlignment设置为{{1 }}。您的代码最终会看起来像这样。
HorizontalAlignment="Stretch"
答案 1 :(得分:1)
我遇到了同样的问题,并提出了这个解决方案。基本上,我们的想法是在网格/列更改时动态更改相应列的MaxWidth。我在这里展示了两列,但我已经成功使用了这三种列的方法。
使用这种方法,如果您再次调整窗口大小以使其不再适合网格内容,则网格会停止更改大小,因此ResizeGrid_SizeChanged事件将停止调用。要解决此问题,您还可以侦听窗口(或用户控件)大小更改事件。您可能还需要适当地绑定网格的MaxWidth,或者如果网格填充窗口/ UserControl,则直接使用控件大小。我已经展示了如何通过XAML绑定MaxWidth属性。如果您不想这样做,可以在后面的窗口代码中用“ActualWidth”替换“ResizeGrid.MaxWidth”,并删除“ResizeGrid”对象上的“MaxWidth”绑定。
XAML:
<Window x:Class="App.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Default="clr-namespace:App"
mc:Ignorable="d"
SizeChanged="Window_SizeChanged"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid x:Name="ResizeGrid" SizeChanged="ResizeGrid_SizeChanged"
MaxWidth="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Default:Window1}}}">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="C0" Width="150" MinWidth="50" />
<ColumnDefinition Width="5" />
<ColumnDefinition x:Name="C2" Width="*" MinWidth="50" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0" Background="Green">
<Label Content="Left" />
<Label Content="Right" HorizontalAlignment="Right" />
</Grid>
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" DragCompleted="GridSplitter_DragCompleted" />
<Grid Grid.Column="2" Background="Red">
<Label Content="Left" />
<Label Content="Right" HorizontalAlignment="Right" />
</Grid>
</Grid>
</Grid>
</Window>
C#代码背后
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
UpdateGridSplitterWidths();
}
private void ResizeGrid_SizeChanged(object sender, SizeChangedEventArgs e)
{
UpdateGridSplitterWidths();
}
private void GridSplitter_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
UpdateGridSplitterWidths();
}
private void UpdateGridSplitterWidths()
{
C0.MaxWidth = Math.Min(ResizeGrid.ActualWidth, ResizeGrid.MaxWidth) - (C2.MinWidth + 5);
}