Question

Il semble y avoir un peu d'un problème avec deux grilles contenant des éléments spécifiés d'une certaine manière, et le SharedSizeGroup.

Cette question est en réponse à une question précédente de DH je tentais de répondre. Pardonnez la longueur, mais il aide à démontrer visuellement le problème.

Sa question initiale a demandé pourquoi deux grilles avec un SharedSizeGroup ne compressait pas à la même hauteur lorsque certaines conditions sont réunies (un redimensionnement TextBlock dans la grille du côté droit). Je pris son exemple et élargi, parce que je doutais qu'il avait à voir avec la mesure / Organiser cycle.

Il se trouve qu'il fait, en fait, doivent faire avec mesure et organiser. En fait, il doit faire avec pas faire une mesure. Je pense que cela peut être au moins un problème, sinon un bug, mais aimerait avoir une explication du comportement.

Voici un aperçu rapide de ce qui se passe (couleurs criardes pour démonstration des fins uniquement).
Démarrage Les deux grilles ont trois rangées, chacune contenant un TextBlock. La rangée du milieu est de SharedSizeGroup. Le texte de la rangée du milieu est lié à la ActualHeight de son TextBlock, avec la propriété initiale de hauteur codé en dur pour les valeurs que vous voyez. Les chiffres ci-dessous représentent les grilles du ActualHeight de cette grille. Notez que la BackgroundColor de la grille gauche est vert.

Démarrage

L'augmentation du TextBlock du côté droit Lorsque la grille du côté droit est augmenté en taille, vous pouvez voir que les deux grilles sont redimensionnés pour la nouvelle hauteur, en raison de la SharedSizeGroup. La colonne à droite reflète la mesure et Réorganiser les appels des grilles.

grossi

Diminuer le côté droit TextBlock Mais encore plus grande que TextBlock du côté gauche Lorsque la grille du côté droit est réduite en taille, mais encore plus grande que la taille du TextBlock codé en dur du côté gauche, vous pouvez voir que les deux grilles redimensionner à nouveau à la nouvelle hauteur, en raison de la SharedSizeGroup. La colonne à droite reflète la mesure et Réorganiser les appels des grilles.

Augmenté à la taille minimum

Diminuer le côté droit TextBlock moins de Taille de TextBlock du côté gauche Lorsque la grille du côté droit est diminué de taille inférieure à la taille du TextBlock codé en dur du côté gauche, vous pouvez voir que la grille côté gauche ne diminue pas la taille « correcte », comme en témoigne en voyant la fond vert de la grille vers le bas, et le fait que la taille de la grille est de 150, pas 130.

Si vous regardez les informations sur le droit, vous remarquerez que la grille gauche avait une Arranger, mais n'a pas fait une mesure.

Taille passé diminution


Voici le code exemple pour dupliquer la question.

les classes InfoGrid et 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;
        }
    }
}

Fenêtre 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>

Fenêtre principale Constructor (uniquement le code dans le code-behind)

Window1 publique ()     {         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));
}
Était-ce utile?

La solution

Selon Microsoft , c'est un bug.

  

Cela semble être un bogue dans WPF, et   Microsoft est conscient et   enquêter sur une solution.

     

Si vous avez besoin d'aide avec une solution de contournement,   s'il vous plaît contacter le support Microsoft à l'adresse

     

http://support.microsoft.com/default. aspx? id = fh; fr; offerprophone

     

Vous pouvez également soumettre des commentaires de bug pour   WPF en ce qui concerne cette question à ...

     

http://connect.microsoft.com/VisualStudio

J'ai présenté cela comme un bug sur le Connecter le site .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top