为什么WPF Grid中带有*的两列大小不一致?

13

使用以下代码,我希望最终得到两个具有相同宽度的ListBox,它们都被放置在两个Width="*"的ColumnDefinition中。

但实际上,它们的大小似乎是由ListBox中的文本大小决定的,这并没有意义,因为该文本要比ListBox小得多,因此TextBlock有足够的空间容纳文本。

<Window x:Class="UnderstandSizing.Window5"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window5" 
SizeToContent="WidthAndHeight"
ResizeMode="NoResize" >

<Grid>  
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <TextBlock Text="Text1longer" Grid.Row="0" Grid.Column="0" x:Name="Test1" />
    <TextBlock Text="Text1" Grid.Row="0" Grid.Column="2" />
    <ListBox Grid.Row="1" Grid.Column="0" Height="150" />

    <ListBox Grid.Row="1" Grid.Column="2" Height="150" />
    <TextBlock Grid.Row="2" Grid.ColumnSpan="3"  Text="This textblock sets the max width" Width="300" />
</Grid>
</Window>

在这里输入图片描述

WPF的自动大小调整功能让我发疯了...有什么想法吗?谢谢。

编辑:所有操作都在VS2008中完成,以防有影响。

4个回答

13

看这个:

http://www.wpftutorial.net/GridLayout.html

"Star (*):

尽可能获取所有可用空间 (在填充了所有自动和固定大小的列之后),按比例分配到所有星号大小的列。 因此,3*/5* 的意思与 30*/50* 相同。 请记住,如果网格大小是基于其内容计算的,则星号大小调整不起作用。"

这是您的代码中的情况。 我怀疑这也是它看起来对其他人进行测试时正常的原因,如果他们将 Grid 粘贴到大于 TextBlock 设置的 300 像素的窗口中。 如果我使用完全相同的 XAML,则会出现与您相同的问题。

编辑:所以这就是“为什么”的原因。 有可能的替代解决方案,请查看此问题:Wpf: Grid: How can i share column/row height width?

最近的答案(并非提问者选择的答案)似乎在这种情况下最有用。


我在一个单独的窗口中拥有完全相同的代码,但无法重现。不过,我是使用VS2010和.NET 4.0。 - Ray
奇怪。我使用的是相同的代码,它被复制了,只是列宽度按预期标记为1*。但实际宽度为167和133。 - Alex A.
我找到了一个非常奇怪的解决方案。如果我将 * 更改为 0,我就可以得到所需的功能:\ - Ignacio Soler Garcia
有趣,但我建议不要使用它。现在可能有效,但谁知道以后会发生什么,除非这种行为在某个地方被指定。 - Alex A.
以正确的方式进行可能会在以后节省你的时间。 - Alex A.

4

Alex. A 找到了发生问题的确切原因,而我在幸运的情况下找到了解决方案。只需将 * 更改为 0,即可获得预期结果(如果您问我,这很奇怪):

<Window x:Class="UnderstandSizing.Window5"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window5" 
SizeToContent="WidthAndHeight"
ResizeMode="NoResize" >

<Grid>  
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="0" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="0" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<TextBlock Text="Text1longer" Grid.Row="0" Grid.Column="0" x:Name="Test1" />
<TextBlock Text="Text1" Grid.Row="0" Grid.Column="2" />
<ListBox Grid.Row="1" Grid.Column="0" Height="150" />

<ListBox Grid.Row="1" Grid.Column="2" Height="150" />
<TextBlock Grid.Row="2" Grid.ColumnSpan="3"  Text="This textblock sets the max width" Width="300" />
</Grid>
</Window>

3

对我来说,这很好用,至少在运行时是这样的。不要相信GUI设计师,他们是敌人。


0

在设计时和运行时都对我有效。

GUI 设计器不应该显示那些像素大小。对我来说,它显示为 1*,这意味着您的截图来自于与您粘贴的代码不同的代码。


完全没有。从IDE到SO,直接使用,没有做任何更改。使用VS2008进行工作。也许这很重要。 - Ignacio Soler Garcia
@SoMoS 奇怪。我使用的是完全相同的代码。窗口中没有其他内容,甚至项目中也没有。.NET 版本?我使用的是 4.0 和 VS2010。 - Ray
当然可以。我正在使用.NET 3.5和VS2008。 - Ignacio Soler Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接