当 SharedSizeGroup 的行高发生变化时,网格高度无法正确调整 [英] Grid height not adjusting properly when a row height with SharedSizeGroup changes

查看:15
本文介绍了当 SharedSizeGroup 的行高发生变化时,网格高度无法正确调整的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个网格,每个网格有三行.每个网格的第一行和最后一行具有固定高度,而中间行具有自动高度并使用 SharedSizeGroup 共享它们的高度.

I have two grids with three rows each. The first and last row of each grid has a fixed height while the middle rows have auto height and share their height using SharedSizeGroup.

首先,右侧网格的内容决定了尺寸组的高度.当右方格的内容缩小,使左方格的内容决定了尺寸组的高度时,左方格的整体大小调整不正确.

First, the content of the right grid determines the height of the size group. When the content of the right grid shrinks so that the content of the left grid determines the height of the size group, the overall size of the left grid is not adjusted correctly.

请参阅以下示例应用.单击增加按钮以增加右侧网格中文本块的大小.左侧网格的大小会相应改变.现在减小尺寸.当文本块变得小于左侧网格中的文本块时,左侧网格的总大小不会缩小.这是一个错误还是我错过了什么?

See the following sample app. Click the increase button to increase the size of the textblock in the right grid. The size of the left grid changes accordingly. Now decrease the size. When the textblock becomes smaller than the textblock in the left grid, the total size of the left grid doesn't shrink. Is this a bug or am i missing something?

<StackPanel Orientation="Horizontal" Grid.IsSharedSizeScope="True">
    <StackPanel Orientation="Vertical" Width="100">
        <Grid Background="Green">
            <Grid.RowDefinitions>
                <RowDefinition Height="15" />
                <RowDefinition SharedSizeGroup="Group1" />
                <RowDefinition Height="15" />
            </Grid.RowDefinitions>
            <TextBlock Background="Blue" Grid.Row="0" />
            <TextBlock Background="Red" Grid.Row="1" Name="textBlock1" Height="100" />
            <TextBlock Background="Blue" Grid.Row="2" />
        </Grid>
        <TextBlock Text="{Binding Path=ActualHeight, ElementName=grid1}" />
    </StackPanel>
    <StackPanel Orientation="Vertical" Width="100">
        <Grid Background="Green">
            <Grid.RowDefinitions>
                <RowDefinition Height="15" />
                <RowDefinition SharedSizeGroup="Group1" />
                <RowDefinition Height="15" />
            </Grid.RowDefinitions>
            <TextBlock Background="Blue" Grid.Row="0" />
            <TextBlock Background="Red" Grid.Row="1" Name="textBlock2" Height="150" />
            <TextBlock Background="Blue" Grid.Row="2" />
        </Grid>
        <TextBlock Text="{Binding Path=ActualHeight, ElementName=grid2}" />
    </StackPanel>
    <Button Height="24" Click="Button_Click_1" VerticalAlignment="Top">Increase</Button>
    <Button Height="24" Click="Button_Click_2" VerticalAlignment="Top">Decrease</Button>
</StackPanel>

<小时>

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    textBlock2.Height += 30;
}

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    textBlock2.Height -= 30;
}

推荐答案

行保持相同的高度 - 第二个 TextBlock 的大小在变化,而第一个 TextBlock 的大小保持 100.

The rows are staying the same height - the size of the second TextBlock is changing, while the size of the first TextBlock remains 100.

为了证明这一点,请进行以下更改:

To demonstrate this, make the following changes:

  • ShowGridLines="True" 添加到每个网格中
  • 更改您命名的 TextBlock 以将其 ActualHeight 显示为文本:

  • Add ShowGridLines="True" to each of your Grids
  • Change your named TextBlocks to show their ActualHeight as their text:

    <TextBlock Background="Red" Grid.Row="1" Name="textBlock2" Height="150"
               Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>

您将看到 SharedSizeGroup 行将是两个 TextBlock 的最大 ActualHeight.

You will see that the SharedSizeGroup row will be the maximum ActualHeight of the two TextBlocks.

更新:展示正在发生的事情的简短项目
我创建了一个 quick-n-dirty 项目来展示正在发生的事情.事实证明,当右侧网格变得小于原始尺寸时,左侧网格会执行 Arrange 而不是 Measure.我不确定我是否完全理解这一点 - 我已发布后续问题 使用相同的解决方案.

Update: A Short Project To Show What's Happening
I've created a quick-n-dirty project to show what's happening. It turns out that when the right grid gets smaller than the original size, the left grid does an Arrange but not a Measure. I am not sure I understand this completely - I have posted a follow-up question with this same solution.

这是我根据您的原件创建的解决方案.它只是将基本网格包装在一个自定义类中,该类在调用 Measure 和 Arrange 时会喷出信息(通过事件).在主窗口中,我只是将该信息放入列表框中.

Here is the solution that I created, based on your original. It simply wraps the basic grid in a custom class that spews out info (via event) when Measure and Arrange are called. In the main window, I just put that info into a list box.

InfoGrid 和 InfoGridEventArgs 类

using System.Windows;
using System.Windows.Controls;
namespace GridMeasureExample
{
    class InfoGrid : Grid
    {
        protected override Size ArrangeOverride(Size arrangeSize)
        {
            CallReportInfoEvent("Arrange");
            return base.ArrangeOverride(arrangeSize);
        }
        protected override Size MeasureOverride(Size constraint)
        {
            CallReportInfoEvent("Measure");
            return base.MeasureOverride(constraint);
        }
        public event EventHandler<InfoGridEventArgs> ReportInfo;
        private void CallReportInfoEvent(string message)
        {
            if (ReportInfo != null)
                ReportInfo(this, new InfoGridEventArgs(message));
        }
    }
    public class InfoGridEventArgs : EventArgs
    {
        private InfoGridEventArgs()
        {
        }
        public InfoGridEventArgs(string message)
        {
            this.TimeStamp = DateTime.Now;
            this.Message = message;
        }
        public DateTime TimeStamp
        {
            get;
            private set;
        }
        public String Message
        {
            get;
            private set;
        }
    }
}

XAML 主窗口

<Window x:Class="GridMeasureExample.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:GridMeasureExample"
        Title="SharedSizeGroup" Height="500" Width="500">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

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

        <StackPanel Grid.Column="0" 
                    Grid.Row="0"
                    Orientation="Horizontal" 
                    HorizontalAlignment="Left"
                    VerticalAlignment="Top"
                    Grid.IsSharedSizeScope="True">

            <StackPanel Orientation="Vertical" Width="100">
                <local:InfoGrid x:Name="grid1" Background="Green" ShowGridLines="True">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="15" />
                        <RowDefinition SharedSizeGroup="Group1" />
                        <RowDefinition Height="15" />
                    </Grid.RowDefinitions>
                    <TextBlock Background="Blue" Grid.Row="0" Text="Row 0"/>
                    <TextBlock Background="Red" Grid.Row="1" Name="textBlock1" Height="100"
                           Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>
                    <TextBlock Background="Blue" Grid.Row="2" Text="Row 2" />
                </local:InfoGrid>
                <TextBlock Text="{Binding Path=ActualHeight, ElementName=grid1}" />
            </StackPanel>

            <StackPanel Orientation="Vertical" Width="100">
                <local:InfoGrid x:Name="grid2" Background="Yellow" ShowGridLines="True">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="15" />
                        <RowDefinition SharedSizeGroup="Group1" />
                        <RowDefinition Height="15" />
                    </Grid.RowDefinitions>
                    <TextBlock Background="Orange" Grid.Row="0" Text="Row 0" />
                    <TextBlock Background="Purple" Grid.Row="1" Name="textBlock2" Height="150"
                           Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>
                    <TextBlock Background="Orange" Grid.Row="2" Text="Row 2" />
                </local:InfoGrid>
                <TextBlock Text="{Binding Path=ActualHeight, ElementName=grid2}" />
            </StackPanel>

        </StackPanel>

        <ListBox x:Name="lstInfo"
                 Grid.Column="1"
                 Grid.Row="0"
                 Margin="10,0,0,0"
                 HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch" />

        <UniformGrid Grid.Column="0"
                     Grid.Row="1"
                     Grid.ColumnSpan="2"
                     Columns="2"
                     HorizontalAlignment="Center"
                     Margin="5">
            <Button x:Name="btnIncrease" Margin="4,0">Increase</Button>
            <Button x:Name="btnDecrease" Margin="4,0">Decrease</Button>
        </UniformGrid>

    </Grid>

</Window>

主窗口构造函数(仅代码隐藏)

公共窗口1(){初始化组件();

public Window1() { InitializeComponent();

    btnIncrease.Click += (s, e) => 
        {
            lstInfo.Items.Add(String.Format("{0} Increase Button Pressed", DateTime.Now.ToString("HH:mm:ss.ffff")));
            textBlock2.Height += 30;
        };
    btnDecrease.Click += (s, e) =>
        {
            lstInfo.Items.Add(String.Format("{0} Decrease Button Pressed", DateTime.Now.ToString("HH:mm:ss.ffff")));
            if (textBlock2.ActualHeight >= 30)
                textBlock2.Height -= 30;
        };

    grid1.ReportInfo += (s, e) => lstInfo.Items.Add(String.Format("{0} Left Grid: {1}", e.TimeStamp.ToString("HH:mm:ss.ffff"), e.Message));
    grid2.ReportInfo += (s, e) => lstInfo.Items.Add(String.Format("{0} Right Grid: {1}", e.TimeStamp.ToString("HH:mm:ss.ffff"), e.Message));
}

这篇关于当 SharedSizeGroup 的行高发生变化时,网格高度无法正确调整的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆