【问题标题】:How to solve this stretching issue in XAML?如何解决 XAML 中的这个拉伸问题?
【发布时间】:2013-03-03 22:37:33
【问题描述】:

我有以下 XAML(简化):

<Grid x:Name="parentGrid">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="0">
        <!-- content which fits its parent grid -->
    </Grid>

    <Grid Grid.Row="1">
        <!-- content which fits its parent grid -->
    </Grid>

    <Grid Grid.Row="2">
        <!-- content which fits its parent grid -->
    </Grid>

    <Grid Grid.Row="3">
        <!-- content which fits its parent grid -->
    </Grid>
</Grid>

这是一个可配置的容器,其中包含一到四个我们的对话框。这个容器被重用了很多,包含的对话框的数量总是不同的。

要求是,如果只有一个对话框(所以只有第一个网格被填充),它应该延伸到整个父网格。如果填充了两个网格,则每个容器应填充父网格的一半。如果有三个......等等。

我无法使用&lt;RowDefinition Height="Auto"/&gt;(无论如何默认)和&lt;RowDefinition Height="*"/&gt;。例如,如果只有一个 Grid 填充,它不适合整个父网格。如果我删除三个RowDefinitions,它仍然有效。

附加信息:未填充网格的可见性始终设置为Visibility.Collapsed

【问题讨论】:

  • Width="Auto" 将用于列,您尝试过 Height="Auto" 吗?或者也许不使用 Grid 作为您的 Parent,而是尝试使用 StackPanel?
  • 我觉得这应该很容易,但我找不到简单的解决方案,所以也许不是。设置Height="Auto" 没有帮助,因为这会将行的大小调整为内容大小,并且内容大小会根据项目的数量而有所不同。可能可以使用转换器做到这一点,但如果不知道是什么决定了显示哪些网格以及如何使用这个容器,就很难说清楚。另一个可以尝试的想法是 UniformGridRows 属性绑定到可见项目的数量,但这再次取决于如何确定可见项目的数量。
  • 啊,我没有注意父部分的填充。我喜欢 Rachels 的 UniformGrid 想法,她推荐的行绑定。可以对常规网格做同样的事情,但我认为这将是你最好的路线。 +1
  • 对不起,我的意思是Height,当然。那只是一个打字错误。但是,这个 UniformGrid 在 Silverlight 5 中可用吗? @Rachel:抱歉,# 是什么意思?
  • @ebeeb 抱歉,# 是表示数字的一种懒惰方式。您可能可以使用UniformGrid,它的Rows 属性绑定到{Binding NumberItems},但这取决于是否有属性可以告诉您有多少项目。另外,如果 UniformGrid 在 Silverlight 中不可用,您可以尝试使用一些 AttachedProperties from my blog 来绑定常规 Grid 的 RowCount

标签: wpf silverlight xaml


【解决方案1】:

我一直发现,如果你想隐藏一个列或行,你可以像这样绑定一个属性:

<Grid x:Name="ParentGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding GridRow0}" />
        <RowDefinition Height="{Binding GridRow1}" />
        <RowDefinition Height="{Binding GridRow2}" />
        <RowDefinition Height="{Binding GridRow3}" />
    </Grid.RowDefinitions>
<-- grid contents -->
</Grid>

设置如下属性:

Public Property GridRow0 as GridLength = New GridLength(GridUnitType.Star)
Public Property GridRow1 as GridLength = New GridLength(GridUnitType.Star)
Public Property GridRow2 as GridLength = New GridLength(GridUnitType.Star)
Public Property GridRow3 as GridLength = New GridLength(GridUnitType.Star)

然后,当您确定需要多少行时,您可以执行类似将计数传递给过程的操作:

Public Sub FixRows(count as Integer)
    Select Case count
        Case 1
            GridRow3 = New GridLength(0)
            GridRow2 = New GridLength(0)
            GridRow1 = New GridLength(0)
            GridRow0 = New GridLength(GridUnitType.Star)
        Case 2
            GridRow3 = New GridLength(0)
            GridRow2 = New GridLength(0)
            GridRow1 = New GridLength(GridUnitType.Star)
            GridRow0 = New GridLength(GridUnitType.Star)
        Case 3
            GridRow3 = New GridLength(0)
            GridRow2 = New GridLength(GridUnitType.Star)
            GridRow1 = New GridLength(GridUnitType.Star)
            GridRow0 = New GridLength(GridUnitType.Star)
        Case 4
            GridRow3 = New GridLength(GridUnitType.Star)
            GridRow2 = New GridLength(GridUnitType.Star)
            GridRow1 = New GridLength(GridUnitType.Star)
            GridRow0 = New GridLength(GridUnitType.Star)
        Case Else
            'Whatever is needed
    End Select
End Sub

【讨论】:

    【解决方案2】:

    我最终创建了一个CustomPanel 和几个NestedCustomPanels。后者提供了不同的行为,例如一个只是用来容纳一个可配置的容器,另一个是在屏幕上均匀排列多个容器。

    在运行时读取配置并创建要添加的某些部分并在后面的代码中添加。

    这种方式为我可以获得的每个可能的配置提供了自定义行为。为了将这一点反映在我在开始帖子中提供的代码中:添加了与配置中可用的容器一样多的 RowDefinitions

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 2023-01-24
      • 2019-04-20
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多