2010-10-08 10 views
4

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

Cette question est en réponse à un earlier question de user D.H. J'ai tenté de répondre. Pardonnez la longueur, mais cela aide à démontrer le problème visuellement. Sa question initiale demandait pourquoi deux grilles avec un SharedSizeGroup ne se redimensionnaient pas à la même hauteur lorsque certaines conditions étaient remplies (redimensionnement d'un TextBlock dans la grille de droite). J'ai pris son exemple et l'ai élargi, parce que je soupçonnais que cela avait à voir avec le cycle Mesurer/Arranger.

Il s'avère qu'il s'agit en fait de mesurer et d'organiser. En fait, il doit faire pas faire une mesure. Je pense que cela peut être au moins un problème, sinon un bug, mais j'aimerais avoir une explication du comportement.

Voici un bref aperçu de ce qui se passe (couleurs criardes à des fins de démonstration seulement).

Démarrage
Les deux grilles ont trois lignes contenant chacune un TextBlock. La rangée du milieu est de SharedSizeGroup. Le texte de la ligne du milieu est lié à ActualHeight de son TextBlock, avec la propriété de hauteur initiale codée en dur aux valeurs que vous voyez. Les nombres en dessous des grilles représentent la hauteur réelle de cette grille. Notez que BackgroundColor de la grille de gauche est vert.

Startup

L'augmentation du côté droit TextBlock
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 les appels de mesure et d'organisation des grilles.

Increased In Size

Diminuer le côté droit TextBlock Mais encore plus grande que du côté gauche TextBlock
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 sont redimensionnées à la nouvelle hauteur, en raison de SharedSizeGroup. La colonne à droite reflète les appels de mesure et d'organisation des grilles.

Decreased to Minimum Size

Diminuer le côté droit TextBlock moins de Taille de TextBlock du côté gauche
Lorsque la grille du côté droit est réduite en taille, inférieure à la taille du TextBlock codé en dur du côté gauche, vous pouvez voir que la grille de gauche ne diminue pas à la taille "correcte", comme en témoigne le fond vert de la grille au fond, et le fait que la taille de la grille est de 150, pas de 130

Si vous regardez les informations sur la droite, vous remarquerez que la grille gauche a fait un arrangement, mais n'a pas fait de mesure.

Decreased Past Size


Voici le code exemple pour dupliquer le problème.

InfoGrid et InfoGridEventArgs cours

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> 

Constructor fenêtre principale (uniquement 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)); 
} 

Répondre

3

According to Microsoft, c'est un bug.

Cela semble être un bogue dans WPF et Microsoft est au courant et enquête sur une solution.

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

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

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

http://connect.microsoft.com/VisualStudio

J'ai envoyé ceci comme un bug sur le .

Questions connexes