【问题标题】:How to set width/height in code without breaking Grid star-size?如何在不破坏网格星号的情况下在代码中设置宽度/高度?
【发布时间】:2017-03-12 14:05:03
【问题描述】:

我有一些这样的 XAML 代码:

<ScrollViewer VerticalScrollMode="Auto">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid x:Name="g1" Grid.Row="0" Background="Pink"/>
        <Grid x:Name="g2" Grid.Row="1" Background="Green"/>
    </Grid>
</ScrollViewer>

<Button Content="Update Size" Width="150" Height="50" Click="Button_Click" Margin="105,342,0,248"/>

和后面的代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    g1.Width = mainGrid.ActualWidth;
    g1.Height = mainGrid.ActualHeight / 2;
}

它在点击按钮之前显示如下:

点击按钮后,将窗口拖大一点,如下图:

所以我的问题是,在单击按钮之前,如果您将窗口拖动到星号大小的作品周围,并将顶部/底部网格的大小调整为窗口大小,但是在单击设置 g1 宽度和高度的按钮后,它会破坏星号-浆纱。设置宽度和高度后,如何让星型重新开始工作?

提前致谢。

【问题讨论】:

  • 我不明白这个问题。设置g1 的尺寸并没有破坏星级。它只是防止该元素拉伸以填充它所在的网格单元格。单元格本身仍然很好,并且星号大小仍然导致它占据它应该占据的 50% 高度。你期望什么行为?请具体。您到底期望会发生什么,但现在没有发生?
  • @Peter Duniho 我希望在单击按钮后可以进行拉伸。正如您所提到的,它可以防止拉伸以填充它所在的网格单元格。我正在尝试找到一种方法来在代码中设置其宽度和高度后再次进行拉伸。
  • “在代码中设置宽度和高度后,我正试图找到一种方法让拉伸再次起作用” -- 你为什么认为这应该有效?根据定义,拉伸是一种机制,通过该机制,元素的宽度和高度由与容器的关系自动确定。通过定义设置宽度和高度是一种显式控制宽度和高度的机制。根据定义,这两者是相互排斥的。为什么你会认为当你告诉 WPF 你想要一个特定的宽度和高度时,除了保持这些尺寸之外,它应该做任何事情?
  • @Peter Duniho 例如,如果我有一个列表视图,其中的项目长于 g1 当前高度,当我将它添加到 g1 并在第三行创建一个名为 g3 的第三个网格时,共享同一个星号-同时使用 g1 和 g2 调整大小,列表视图将改变 g1 的高度,并导致 g1、g2 和 g3 之间的行定义变得不均匀。我在这里要做的是在将列表视图添加到 g1 之后,所有 3 个网格仍然保持它们原来的共享星大小,并且当我调整窗口大小时,所有 3 个网格仍然可以拉伸到窗口。

标签: c# windows-runtime uwp win-universal-app uwp-xaml


【解决方案1】:

如何在设置宽度和高度后重新调整星型大小?

在为 Grid g1 设置宽度和高度后,您打破了自动调整星型大小。但是您可以使用Window.SizeChanged 事件来监视应用程序窗口视图的大小变化。当窗口大小改变时,自行为g1动态设置新的高度和宽度,以适应父控件mainGrid

以下代码将满足您当前的要求。

 public Strangelaout()
 {
     this.InitializeComponent();
     Window.Current.SizeChanged += Current_SizeChanged;
 }

 private void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
 {
     g1.Width = mainGrid.ActualWidth;
     g1.Height = mainGrid.ActualHeight / 2;
 }

 private void Button_Click(object sender, RoutedEventArgs e)
 {
     g1.Width = mainGrid.ActualWidth;
     g1.Height = mainGrid.ActualHeight / 2;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2010-12-21
    • 2012-02-24
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多