C# 调整主窗口大小时,带GridSplitter的网格大小调整不正确
我有一个可以调整大小的wpf窗口: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"
<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}”