调整主网格大小时,使用 GridSplitter 的网格调整大小不正确 window
Grid with GridSplitter is resized incorrectly when resizing the main window
我有一个可以调整大小的 wpf window:
<Window x:Class="WpfTester.BadResize"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BadResize"
Height="300"
Width="600"
MinWidth="600">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="250" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Left Panel" />
<GridSplitter Grid.Column="1"
ResizeDirection="Columns"
Width="3"
HorizontalAlignment="Stretch" />
<TextBox Grid.Column="2"
TextWrapping="Wrap"
Text="Test text test text test text test text test text test text test text test text test text text test text test text test text" />
</Grid>
</Window>
这个 window 有一个带有左右面板的网格,它们之间有一个 GridSplitter。
我运行程序:
然后我执行以下步骤:
- 将右 window 边框调整到右侧,使文本适合文本框而不自动换行
- 将GridSpliiter移到最左边(这一步很重要)
- 开始将右 window 边框调整回左侧。它工作正常,只要文本适合文本框,文本框就会完美调整大小
- 一旦文本不适合文本框并且需要自动换行,文本框将停止调整大小并以这种方式超出 window:
你能帮我弄清楚如何用网格分隔器安排布局,使文本框不会超出 window 吗?
您不应该为您的 gridsplitter 创建一个专栏。将它与您的其中一个元素放在同一列中。这样它更可预测,并且您知道它正在调整哪些列的大小。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="250" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Left Panel" Margin="0,0,3,0"/>
<GridSplitter Grid.Column="0"
ResizeDirection="Columns"
Width="3"
HorizontalAlignment="Right" VerticalAlignment="Stretch" />
<TextBox Grid.Column="1"
TextWrapping="Wrap"
Text="Test text test text test text test text test text test text test text test text test text text test text test text test text" />
</Grid>
我想将第一个列的宽度设置为 AUTO 会更有意义,但当然你自己试试看哪个更合适。
经过多次实验后,如果有另一个元素(具有非零边距)来测量列宽并将该值绑定到 TextBox.Width
,则 Wrap 仅适用于我的 GridSplitter
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="250"/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Left Panel" Name="lbl"/>
<GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" />
<Border Grid.Column="2" Name="test" Margin="0.05"/>
<TextBox Grid.Column="2"
Width="{Binding ActualWidth, ElementName=test, Mode=OneWay}"
TextWrapping="Wrap"
Text="Test1 text2 test3 text4 test5 text6 test7 text8 test9 text0 test1 text2 test3 text4 test5 text6 test7 text8 text9 test0 text1 test2 text3 test4 text5" />
</Grid>
我有一个可以调整大小的 wpf window:
<Window x:Class="WpfTester.BadResize"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BadResize"
Height="300"
Width="600"
MinWidth="600">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="250" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Left Panel" />
<GridSplitter Grid.Column="1"
ResizeDirection="Columns"
Width="3"
HorizontalAlignment="Stretch" />
<TextBox Grid.Column="2"
TextWrapping="Wrap"
Text="Test text test text test text test text test text test text test text test text test text text test text test text test text" />
</Grid>
</Window>
这个 window 有一个带有左右面板的网格,它们之间有一个 GridSplitter。
我运行程序:
然后我执行以下步骤:
- 将右 window 边框调整到右侧,使文本适合文本框而不自动换行
- 将GridSpliiter移到最左边(这一步很重要)
- 开始将右 window 边框调整回左侧。它工作正常,只要文本适合文本框,文本框就会完美调整大小
- 一旦文本不适合文本框并且需要自动换行,文本框将停止调整大小并以这种方式超出 window:
你能帮我弄清楚如何用网格分隔器安排布局,使文本框不会超出 window 吗?
您不应该为您的 gridsplitter 创建一个专栏。将它与您的其中一个元素放在同一列中。这样它更可预测,并且您知道它正在调整哪些列的大小。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="250" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Left Panel" Margin="0,0,3,0"/>
<GridSplitter Grid.Column="0"
ResizeDirection="Columns"
Width="3"
HorizontalAlignment="Right" VerticalAlignment="Stretch" />
<TextBox Grid.Column="1"
TextWrapping="Wrap"
Text="Test text test text test text test text test text test text test text test text test text text test text test text test text" />
</Grid>
我想将第一个列的宽度设置为 AUTO 会更有意义,但当然你自己试试看哪个更合适。
经过多次实验后,如果有另一个元素(具有非零边距)来测量列宽并将该值绑定到 TextBox.Width
,则 Wrap 仅适用于我的 GridSplitter<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="250"/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Left Panel" Name="lbl"/>
<GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" />
<Border Grid.Column="2" Name="test" Margin="0.05"/>
<TextBox Grid.Column="2"
Width="{Binding ActualWidth, ElementName=test, Mode=OneWay}"
TextWrapping="Wrap"
Text="Test1 text2 test3 text4 test5 text6 test7 text8 test9 text0 test1 text2 test3 text4 test5 text6 test7 text8 text9 test0 text1 test2 text3 test4 text5" />
</Grid>