Измерение / расположение сеток с SharedSizeGroup - PullRequest
4 голосов
/ 08 октября 2010

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

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

В его первоначальном вопросе спрашивалось, почему две сетки с SharedSizeGroup не меняли размер до одной высоты при выполнении определенных условий (изменение размера TextBlock в правой сетке). Я взял его пример и расширил его, потому что подозревал, что это связано с циклом «Измерить / Расположить».

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

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

Запуск
Обе сетки имеют три строки, каждая из которых содержит TextBlock. Средний ряд имеет SharedSizeGroup. Текст средней строки привязан к ActualHeight его TextBlock, с начальным свойством Height, жестко запрограммированным для значений, которые вы видите. Числа под сетками представляют фактическую высоту этой сетки. Обратите внимание, что BackgroundColor левой сетки имеет зеленый цвет.

Startup

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

Increased In Size

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

Decreased to Minimum Size

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

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

Decreased Past Size


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

Классы 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>

Конструктор главного окна (только код с выделенным кодом)

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));
}

1 Ответ

3 голосов
/ 15 октября 2010

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

Это похоже на ошибку в WPF, и Microsoft знает об этом и исследуя решение.

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

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

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

http://connect.microsoft.com/VisualStudio

Я отправил сообщение об ошибке на сайте Connect .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...