Pregunta

Parece que hay un poco de un problema con dos rejillas que contienen elementos especificados de una manera determinada, y la SharedSizeGroup.

Esta pregunta se hace en respuesta a un pregunta anterior de he tratado de responder. Perdona la longitud, sino que ayuda a demostrar el problema visual.

Su pregunta original preguntó por qué dos rejillas con un SharedSizeGroup no cambian de tamaño a la misma altura cuando se cumplen ciertas condiciones (cambio de tamaño de un TextBlock en la red del lado derecho). Me tomó su ejemplo y lo amplió, porque sospechaba que tenía que ver con la Medida / Organizar ciclo.

Resulta que lo hace, de hecho, tiene que ver con la medida y arreglos. En realidad, tiene que ver con no haciendo una Medida. Creo que este puede ser al menos un problema, si no es un error, pero le gustaría tener una explicación del comportamiento.

Aquí está una descripción rápida de lo que sucede (colores llamativos para propósitos de demostración solamente).
Arranque
Ambas redes tienen tres filas, cada uno con un TextBlock. La fila del medio es de SharedSizeGroup. El texto de la fila central se une a la ActualHeight de su TextBlock, con la propiedad inicial de Altura no modificable a los valores que se ven. Los números debajo de las rejillas representan la ActualHeight de esa rejilla. Tenga en cuenta que la BackgroundColor de la rejilla izquierda es verde.

Inicio

El aumento de la TextBlock del lado derecho
Cuando la rejilla del lado derecho se aumenta de tamaño, se puede ver que ambas rejillas cambiar el tamaño a la nueva altura, debido a la SharedSizeGroup. La columna de la derecha refleja la medida y organizar las llamadas de las redes.

aumentado de tamaño

Disminuir el lateral derecho TextBlock Pero aún superior del lado izquierdo TextBlock
Cuando la rejilla del lado derecho se reduce en tamaño, pero aún mayor que el tamaño de la TextBlock no modificable de la parte izquierda, se puede ver que los dos rejillas de nuevo cambiar el tamaño a la nueva altura, debido a la SharedSizeGroup. La columna de la derecha refleja la medida y organizar las llamadas de las redes.

disminuyó a Tamaño mínimo

Disminuir el tamaño del lado derecho TextBlock menos que del lateral izquierdo TextBlock
Cuando la rejilla del lado derecho se reduce en tamaño, menor que el tamaño de la TextBlock no modificable de la parte izquierda, se puede ver que la rejilla del lado izquierdo no disminuye con el tamaño "adecuado", como se evidencia por ver el fondo verde de la rejilla en la parte inferior, y el hecho de que el tamaño de la rejilla es de 150, no 130.

Si nos fijamos en la información a la derecha, se puede observar que la rejilla izquierda tenía una amueblar, pero no hizo una Medida.

La disminución de tamaño Pasado


Aquí está el código de ejemplo para duplicar el problema.

InfoGrid y InfoGridEventArgs clases

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

Ventana principal 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>

Ventana principal Constructor (sólo el código en el código subyacente)

Window1 pública ()     {         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));
}
¿Fue útil?

Solución

De acuerdo con Microsoft , es un error.

  

Esto parece ser un error en WPF, y   Microsoft es consciente de ello y   la investigación de una solución.

     

Si necesita ayuda con una solución,   contacte con Microsoft Support en

     

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

     

También puede enviar sus comentarios de errores para   WPF con respecto a este tema en ...

     

http://connect.microsoft.com/VisualStudio

he presentado esto como un error en la Conectar sitio .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top