Domanda

Ci sembra essere un po 'un problema con due griglie contenenti elementi specificati in un certo modo, e lo SharedSizeGroup.

Questa domanda è in risposta a un domanda precedente da DH ho tentato di rispondere. Perdonate la lunghezza, ma aiuta a dimostrare il problema visivo.

La sua domanda iniziale chiesto perché due griglie con SharedSizeGroup non ridimensionare alla stessa altezza, quando sono state soddisfatte determinate condizioni (il ridimensionamento di un TextBlock nella griglia di destra). Ho preso il suo esempio e ampliato, perché ho il sospetto che aveva a che fare con la Misura / Disporre ciclo.

Si scopre che lo fa, infatti, hanno a che fare con misura e Arrange. In realtà, si ha a che fare con non fare una misura. Credo che questo può essere almeno un problema, se non un bug, ma vorrebbe avere una spiegazione del comportamento.

Ecco una rapida panoramica di ciò che accade (colori sgargianti solo demo scopi).
Start Up
Entrambe le griglie hanno tre righe, ciascuna contenente un TextBlock. La fila centrale è di SharedSizeGroup. Il testo della fila centrale è legato alla ActualHeight della sua TextBlock, con la proprietà iniziale di altezza hard-coded per i valori che vedete. I numeri sotto le griglie rappresentano l'ActualHeight di quella griglia. Si noti che la BackgroundColor della griglia sinistra è verde.

Avvio

Aumentare il TextBlock del lato destro
Quando la griglia destra è aumentata in termini di dimensioni, si può vedere che entrambe le griglie di ridimensionare per la nuova altezza, a causa della SharedSizeGroup. La colonna a destra riflette la misura e disporre le chiamate delle griglie.

aumentato di dimensioni

La riduzione della parte destra TextBlock Ma ancora superiore della parte sinistra TextBlock
Quando la griglia destra è diminuita in termini di dimensioni, ma ancora più grande delle dimensioni del TextBlock hard-coded del lato sinistro, si può vedere che entrambe le griglie di nuovo ridimensionare per la nuova altezza, a causa della SharedSizeGroup. La colonna a destra riflette la misura e disporre le chiamate delle griglie.

Diminuzione alla taglia minima

La riduzione della parte destra TextBlock di dimensioni inferiori di TextBlock della parte sinistra
Quando la griglia destra è diminuita in termini di dimensioni, inferiore alla dimensione del TextBlock hard-coded del lato sinistro, si può vedere che la griglia lato sinistro non diminuisce la "propria" dimensione, come dimostra vedendo il sfondo verde della griglia nella parte inferiore, e il fatto che le dimensioni della griglia è di 150, non 130.

Se guardate le informazioni sulla destra, si noterà che la griglia di sinistra ha un Arrange, ma non ha fatto una misura.

Diminuzione del passato Size


Ecco il codice di esempio per duplicare il problema.

InfoGrid e InfoGridEventArgs classi

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

Finestra principale 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>

Finestra principale Constructor (solo il codice nel code-behind)

pubblico 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));
}
È stato utile?

Soluzione

Secondo Microsoft , si tratta di un bug.

  

Questo sembra essere un bug in WPF, e   Microsoft è a conoscenza di esso e   indagando una soluzione.

     

Se hai bisogno di aiuto con una soluzione,   si prega di contattare il supporto Microsoft a

     

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

     

Si può anche inviare un feedback bug   WPF per quanto riguarda questo problema a ...

     

http://connect.microsoft.com/VisualStudio

Ho presentato questo come un bug sul Connetti sito .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top