调整主网格大小时,使用 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。 我运行程序:

然后我执行以下步骤:

  1. 将右 window 边框调整到右侧,使文本适合文本框而不自动换行
  2. 将GridSpliiter移到最左边(这一步很重要)
  3. 开始将右 window 边框调整回左侧。它工作正常,只要文本适合文本框,文本框就会完美调整大小
  4. 一旦文本不适合文本框并且需要自动换行,文本框将停止调整大小并以这种方式超出 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>