Frage

Es scheint mit zwei Gitter ein bisschen ein Problem zu sein, Elemente enthält, die in einer bestimmten Art und Weise angegeben wird, und die SharedSizeGroup.

Diese Frage ist in Reaktion auf eine frühere Frage von Benutzer DH ich zu beantworten versucht. Verzeihen Sie die Länge, aber es hilft, das Problem visuell zu demonstrieren.

Seine ursprüngliche Frage gestellt, warum zwei Gitter mit einem SharedSizeGroup nicht auf die gleiche Höhe die Größe haben, wenn bestimmte Bedingungen erfüllt sind (ein Textblock auf der rechten Seite Gitter Ändern der Größe). Ich nahm sein Beispiel und erweiterte es, weil ich den Verdacht, dass es mit der Maßnahme / Umschau Zyklus zu tun hatte.

Es stellt sich heraus, dass es funktioniert, in der Tat, mit Messen zu tun und anordnen. Eigentlich hat es damit zu tun, nicht eine Maßnahme zu tun. Ich glaube, dass dies zumindest ein Problem sein kann, wenn nicht ein Fehler, möchte aber eine Erklärung für das Verhalten haben.

Hier ist ein kurzer Überblick über, was passiert (grelle Farben für Demo-Zwecke nur).
Start Up
Beide Gitter haben drei Reihen, die jeweils einen Textblock enthält. Die mittlere Reihe ist von SharedSizeGroup. Der Text der mittleren Reihe ist mit dem Actual seiner TextBlock- gebunden, mit der ursprünglichen Eigenschaft Height hartcodiert auf die Werte, die Sie sehen. Die Zahlen unter den Gittern stellen die Actual dieses Gitters. Beachten Sie, dass der Background des linken Gitters ist Grün.

Inbetriebnahme

Die Erhöhung der rechten Seite TextBlock-
Wenn die rechte Seite Gitter vergrößert ist, können Sie sehen, dass beide Netze auf die neue Höhe aufgrund der SharedSizeGroup ändern. Die Spalte auf der rechten Seite spiegelt die Maßnahme und Vereinbaren Anrufe der Netze.

Erhöhte In Größe

Eine Verringerung der rechten Seite TextBlock- aber immer noch größer als linke TextBlock-
Wenn die rechte Seite Gitter in der Größe verringert wird, aber immer noch größer als die Größe der hartcodierte Textblock auf der linken Seite können Sie sehen, dass beide wieder Gitter auf die neue Höhe Größe ändern, aufgrund der SharedSizeGroup. Die Spalte auf der rechten Seite spiegelt die Maßnahme und Vereinbaren Anrufe der Netze.

abnehmend bis Mindestgröße

Eine Verringerung der rechten Seite TextBlock- weniger als Größe der linken Seite TextBlock-
Wenn die rechte Seite Gitter in der Größe verringert wird, kleiner als die Größe des hartcodierte Textblockes auf der linken Seite können Sie sehen, dass die linksseitige Gitter auf die „richtige“ Größe nicht abnehmen, wie durch die sehenden Grüner Hintergrund des Gitters am Boden, und die Tatsache, dass die Größe des Gitters 150, nicht 130

Wenn Sie auf die Info auf der rechten Seite betrachten, werden Sie feststellen, dass die linke Gitter hat eine anordnen, aber hat keinen Measure tun.

Verminderte Vergangenheit Size


Hier ist der Beispielcode um das Problem zu duplizieren.

Infogitter und InfoGridEventArgs Klassen

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

Hauptfenster 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>

Hauptfenster-Konstruktor (nur Code in Code-behind)

öffentliche 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));
}
War es hilfreich?

Lösung

Laut Microsoft , es ist ein Fehler.

  

Dies scheint ein Bug in WPF zu sein, und   Microsoft ist sich dessen bewusst und   Untersuchung einer Lösung.

     

Wenn Sie Hilfe mit einer Vermeidung des Problems benötigen,   bitte Kontakt Microsoft Support unter

     

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

     

Sie können auch Fehler Feedback einreichen für   WPF zu diesem Thema bei ...

     

http://connect.microsoft.com/VisualStudio

Ich habe als Bug eingereicht dies auf der Connect-Website .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top