【问题标题】:Why two columns in a WPF Grid with * do not have the same size?为什么带有 * 的 WPF 网格中的两列大小不同?
【发布时间】:2012-02-24 09:41:13
【问题描述】:

使用以下代码,我希望以两个具有相同宽度的 ListBox 结束,它们进入两个带有 With="*" 的列定义

看起来大小是由 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 中完成,以防万一。

【问题讨论】:

    标签: .net wpf grid resize sizetocontent


    【解决方案1】:

    对我来说,这在运行时工作得很好。不要相信 GUI 设计师,他们是敌人。

    【讨论】:

      【解决方案2】:

      在设计时和运行时为我工作。

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

      【讨论】:

      • 一点也不。从IDE直接到SO,没有做任何改变。使用 VS2008。也许这很重要。
      • @SoMoS 很奇怪。我使用的是完全相同的代码。窗口甚至项目中都没有其他内容。 .NET 版本?我使用的是 4.0 和 VS2010
      • 当然可以。我正在使用 NET 3.5 和 VS2008
      【解决方案3】:

      看看这个:

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

      “星号(*):

      占用尽可能多的空间(在填充所有自动和固定大小的列之后),按比例分配给所有星号大小的列。所以 3*/5* 和 30*/50* 的意思是一样的。 请记住,如果网格大小是根据其内容计算的,则星号大小不起作用。"

      您的代码就是这种情况。我怀疑这也是其他人测试它看起来不错的原因,如果他们将网格粘贴到大于 TextBlock 设置的 300 像素的窗口中。如果我使用完全相同的 XAML,我会遇到同样的问题。

      编辑:这就是“为什么”。请参阅此问题以获取可能的替代解决方案:Wpf: Grid: How can i share column/row height width?

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

      【讨论】:

      • 我在自己的窗口中有完全相同的代码,无法重现。不过使用 VS2010 和 .NET 4.0。
      • 奇数。我使用的是相同的,它被复制了,除了列宽按预期表示为 1* 。但实际宽度是 167 和 133。
      • 我找到了一个非常奇怪的解决方案。如果我将 * 更改为 0,我将获得所需的功能:\
      • 很有趣,但我建议不要使用它。它现在可能有效,但谁知道以后会发生什么,除非在某处指定了这种行为。
      • 以正确的方式去做可能会在以后节省您的汗水。
      【解决方案4】:

      亚历克斯。 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多