Измерьте / договориться с селыми с помощью SharedSizeGroup

StackOverflow https://stackoverflow.com/questions/3891603

  •  28-09-2019
  •  | 
  •  

Вопрос

Кажется, есть немного проблемы с двумя решетками, содержащими элементы, указанные определенным образом, и SharedSizeGroup.

Этот вопрос в ответ на более ранний вопрос от Пользователь DH. Я попытался ответить. Прости длину, но это помогает продемонстрировать проблему визуально.

Его первоначальный вопрос спросил, почему две сетки с SharedSizeGroup не разместили на одну и ту же высоту, когда были выполнены определенные условия (изменение изменений текстового блока в правой стороне GRID). Я взял свой пример и расширил его, потому что я подозревал, что ему приходилось делать с циклом меры / устраивать.

Оказывается, это, на самом деле, связано с мерой и договориться. На самом деле, это связано с нет делать меру. Я чувствую, что это может быть хотя бы проблема, если не ошибка, но хотела бы иметь объяснение поведения.

Вот быстрый обзор того, что происходит (только цвета для демонстрационных целей).

Запускать
Оба сетки имеют три ряда, каждый из которых содержит текстовыйБлок. Средний ряд имеет sharedsizegroup. Текст среднего ряд связан с фактическими его текстовыми блоками, при этом свойство начальной высоты, жестко закодированным к значениям, которые вы видите. Числа под сенами представляют собой фактическую часть этой сетки. Обратите внимание, что фонCLOR левой сетки зеленая.

Startup

Увеличение правого текстового блока
Когда правая сетка увеличивается по размеру, вы можете видеть, что обе сетки изменяют размер на новую высоту из-за SharedSizeGroup. Столбец справа отражает измерение и организовать вызовы решеток.

Increased In Size

Уменьшение правильного текстового блока, но все еще больше, чем текстовое блок
Когда съемка с правой стороны уменьшается по размеру, но все же больше, чем размер жесткокодируемого текстового блока левой стороны, вы можете видеть, что оба сетка снова разместится на новой высоте из-за SharedSizeGroup. Столбец справа отражает измерение и организовать вызовы решеток.

Decreased to Minimum Size

Уменьшение справа от текстового блока меньше, чем размер текстового блока
Когда правая сетка уменьшается по размеру, меньше, чем размер жесткокодируемого текстового блока левой стороны, вы видите, что левая сетка не уменьшается до «правильного» размера, как показано, увидев Зеленый фон сетки на дне, и тот факт, что размер сетки 150, а не 130.

Если вы посмотрите на информацию справа, вы заметите, что левая сетка была организована, но не делал меру.

Decreased Past Size


Вот пример код для дублирования проблемы.

Инфографические и инфографические классы

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>

Главный оконный конструктор (только код в коде-позади)

Public Window1 () {ItivalizeComponent ();

    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));
}
Это было полезно?

Решение

Согласно Microsoft, это ошибка.

Похоже, что это ошибка в WPF, и Microsoft осведомлен об этом и расследует решение.

Если вам нужна помощь с обходным путем, пожалуйста, свяжитесь с поддержкой Microsoft в

http://support.microsoft.com/default.aspx?id=fh ;en-us ;offerprophone.

Вы также можете представить отзывы об ошибках для WPF относительно этой проблемы в ...

http://connect.microsoft.com/visualstudio.

Я отправил это как ошибку на Соедините сайт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top