Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调整主窗口大小时,带GridSplitter的网格大小调整不正确_C#_Wpf_Window Resize_Gridsplitter - Fatal编程技术网

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

C# 调整主窗口大小时,带GridSplitter的网格大小调整不正确,c#,wpf,window-resize,gridsplitter,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"

我有一个可以调整大小的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。 我运行程序:

然后,我执行以下步骤:

  • 向右调整右窗口边框的大小,以允许文本适合文本框,而无需换行
  • 将网格指示器移到最左侧(此步骤很重要)
  • 开始将右窗口边框重新调整到左侧。它可以正常工作,只要文本适合文本框,文本框的大小就可以完全调整
  • 一旦文本与文本框不匹配且需要换行,文本框将停止调整大小并以这种方式跳出窗口:

  • 您能帮我弄清楚如何使用grid splitter来安排布局,使文本框不会超出窗口吗?

    您不应该为grid splitter制作列。将其与其中一个元素保持在同一列中。这样就更容易预测,并且您知道它正在调整哪些列的大小

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

    我想将第一列的宽度设置为“自动”会更有意义,但当然,您可以自己试试,看看什么更合适。

    经过多次实验后,Wrap仅在有其他元素(非零边距)测量列宽并将该值绑定到TextBox.width时才与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>
    
    
    
    我同意它看起来更好,但工作方式与我在问题中描述的相同。您可能错过了第2步将网格指示器移到最左侧。嗯,我做到了。。它仍然有效。。但正如我在回答中提到的,我使用:
    不,这不酷。当第一列定义宽度为“自动”时,调整主窗口边框大小时,第一列的大小不会调整。这就是为什么我确实需要列定义宽度为“*”。但好的,现在我尝试使用*。而且它仍然包裹着。您是否仍有3列,或者是否使用了我提供的代码?使用我提供的代码,它肯定能按您想要的方式工作。是的,它能工作。但是,如果在这个网格的第二列中有8-10个文本框或文本块,那么调整大小的速度会非常慢,因为以这种方式组织布局时,FormatLine函数需要花费很多时间。只需复制并粘贴相同的10个文本框,将它们包装在某个网格中,运行应用程序,将网格列表移到最左侧,然后尝试调整窗口大小。只有将网格指示器移到最左侧,它才会变慢。似乎是WPF中的一个bug。我刚刚尝试过(使用UniformGrid和20多个文本框),但不能说它变慢了。我在UniformGrid上使用了
    Width=“{Binding ActualWidth,ElementName=test,Mode=OneWay}”