C# 不影响其容器大小的控件

C# 不影响其容器大小的控件,c#,wpf,xaml,layout,C#,Wpf,Xaml,Layout,这有点难以解释,但我会尽力的。 我现在有一个两列几行的网格。 我只希望第二列中的控件有助于网格的高度 因此,在下面的示例中,我希望listbox是两个文本块的高度,如果需要显示更多数据,则显示一个滚动条。我对如何做到这一点一无所知 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="2*" /

这有点难以解释,但我会尽力的。 我现在有一个两列几行的网格。 我只希望第二列中的控件有助于网格的高度

因此,在下面的示例中,我希望listbox是两个文本块的高度,如果需要显示更多数据,则显示一个滚动条。我对如何做到这一点一无所知

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

    <ListBox Grid.RowSpan="2" Grid.Column="0" VerticalAlignment="Stretch" />

    <TextBlock Grid.Row="0" Grid.Column="1" />
    <TextBlock Grid.Row="1" Grid.Column="1" />
</Grid>

现在看起来网格正在拉伸以填充其父网格。尝试将外部栅格的“高度”设置为“自动”,将“垂直对齐”设置为“顶部”:

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

  <ListBox Grid.RowSpan="2" Grid.Column="0" VerticalAlignment="Stretch" />

  <TextBlock Grid.Row="0" Grid.Column="1" />
  <TextBlock Grid.Row="1" Grid.Column="1" />
</Grid>

如果您不介意讨厌的黑客攻击:

<FrameworkElement Grid.RowSpan="2" Grid.Column="0" Name="Hax" />
<ListBox Grid.RowSpan="2" Grid.Column="0"
         Height="{Binding ActualHeight, ElementName=Hax}"/>


这不会改变任何东西,列表框仍然在指示高度。实际上,网格的垂直对齐可以是除拉伸之外的任何东西。这并不能解决我的问题。我同意@H.B.,它不会改变这样一个事实,即如果
列表框
增长,则网格将增长。不,列表框不会驱动高度(除了影响包含网格的最小高度),默认情况下,它会拉伸以填充其父网格。高度默认为“自动”,垂直对齐默认为“拉伸”。尝试设置文本块的高度,注意列表框会拉伸。您尝试过这样做吗?ScrollView没有预定义的大小,因此我希望网格符合第二列中控件的大小。您可能不想使用列,因为我认为如果不使用过程代码,您无法自动调整它们的大小。您可能希望在栅格或堆栈面板中使用栅格。在不知道需求的情况下,我不能说你应该怎么做——你希望有多少个列表框,只有一个?您希望有多少个文本块,只有2个?或者每个复合项都有一个列表框和两个文本块,并且必须将这些项按行堆叠?@mydogisbox-我已经尝试过了,但它对我不起作用。你到底尝试了什么,哪些没有按照你的要求工作?@Moozhe-我希望这是一个通用的解决方案,这样列中的项就不重要了。不管怎样,你都可以在另一个网格的第一列中包装所有内容。是的,我知道我可以做到这一点,而且它确实有效。然而,正如你提到的,这并不是最漂亮的事情。我希望有更好的方法。@BryanWatts:通过分别覆盖
Measure
Arrange
来实现控件怎么样?我认为你是对的@H.B。这可能是唯一干净的方法。@H.B.-我不介意创建自己的控件,对于这样一个简单的设计请求来说,这似乎有些过分了。我不熟悉
测量
排列
。我假设它们是
FrameworkElement
上的方法?我会调查的。@BryanWatts:只是一个警告,这可能是不可能的,因为您在这些方法中获得的信息有限。您可能希望占用其他控件指定的空间,但是在进行测量时,它们可能没有这样做,并且每个子控件都独立进行评估。如果是这种情况,您需要从根本上解决它:子类Grid并复制和修改它的度量和排列,然后您可以创建一个新的附加属性,如
GridEx.AffectsLayout
,以获取无空间信息。