调整主窗口大小时,GridSplitter的网格调整不正确

时间:2016-05-24 11:24:15

标签: c# wpf window-resize gridsplitter

我有一个可以调整大小的wpf窗口:

<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>

此窗口有一个网格,左侧和右侧面板以及它们之间的GridSplitter。 我运行程序: enter image description here

然后我执行以下步骤:

  1. 将右侧窗口边框调整到右侧,以允许文本适合文本框而无需自动换行 enter image description here
  2. 将GridSpliiter移动到最左侧(此步骤很重要) enter image description here
  3. 开始将右侧窗口边框调整为左侧。它工作正常,只要文本适合文本框,文本框就会完美调整大小 enter image description here
  4. 一旦文本不适合文本框并且需要自动换行,文本框就会停止调整大小并以这种方式进入窗口: enter image description here
  5. 你能不能帮我弄清楚如何用文本框不会超出窗口的方式安排网格分割器的布局?

2 个答案:

答案 0 :(得分:0)

您不应为您的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更有意义,但当然可以尝试自己,看看哪种更适合。

答案 1 :(得分:0)

经过多次实验后,如果有另一个元素(非零边距)测量列宽并将该值绑定到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>