2010-11-02 3 views
1

Je crée un contrôle WPF personnalisé dérivé de Grid. C'est un échiquier et donc je veux que sa largeur soit la même que sa hauteur. Comment puis-je accomplir cela?Remplacement de la taille du contrôle personnalisé WPF

Editer:

J'ai essayé ce qui suit.

private void cbcBoard_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     if (e.NewSize.Width != e.NewSize.Height) 
     { 
      double m = Math.Min(e.NewSize.Width, e.NewSize.Height); 

      cbcBoard.Width = m; 
      cbcBoard.Height = m; 
     } 
    } 

Cela n'a pas fonctionné. Des idées?

Merci.

Répondre

2

Nouvelle solution/solution de contournement. UserControl peut rester tel quel, nous laisserons la mise à l'échelle au conteneur parent.

Nous ne pouvons pas atteindre Min (Largeur, Hauteur) avec juste UserControl car si nous lui donnons la Hauteur, alors le conteneur parent ne le mettra pas à l'échelle verticalement et il en va de même pour Width. Si nous essayons de les jongler, il y a des situations où nous nous retrouvons dans une boucle de redimensionnement de largeur/hauteur infinie. Ce dont nous avons besoin, c'est d'un autre contrôle caché dans le même espace qui le remplit complètement et qui peut nous dire quelle est sa largeur et sa hauteur à chaque changement. Ensuite, nous pouvons utiliser la solution Math.Min (Width, Height). Quelque chose comme ça. Notez comment les deux contrôles sont dans Grid.Row = "1" et Grid.Column = "1".

<Rectangle Name="availableSpace" 
      SizeChanged="availableSpace_SizeChanged" 
      Fill="Transparent" 
      Grid.Row="1" 
      Grid.Column="1"/> 
<myLib:UserControl1 x:Name="userControl11" 
        Grid.Row="1" 
        Grid.Column="1" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Top"/> 

Et puis dans le availableSpace_SizeChanged EventHandler

private void availableSpace_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    double minValue = Math.Min(availableSpace.ActualWidth, availableSpace.ActualHeight); 
    userControl1.Width = minValue; 
    userControl1.Height = minValue; 
} 

Maintenant, nous avons 1: 1 de l'UserControl et il sera échelle aussi bien verticalement qu'horizontalement

+0

La première réponse a bien fonctionné, sauf que j'ai besoin à la fois de la Largeur et de la Hauteur pour être Math.Min (Largeur, Hauteur). Comment cela serait-il mis en œuvre? – SuprDewd

+0

Je ne suis pas sûr de comprendre ce que vous voulez dire, la hauteur sera toujours égale à la largeur réelle. Quelle est la valeur Min dans Math.Min (Width, Height)? Une autre valeur ou la largeur/hauteur de votre contrôle? –

+0

Umm ... Je veux Avec et Hauteur être 1: 1. Et si le contrôle est dans une fenêtre de 500x300 (Largeur x Hauteur) alors mon contrôle deviendra, par défaut, 500x300. Ensuite, mon événement SizeChanged se déclenche et le contrôle devient 500x500. Maintenant, sa hauteur sort de la fenêtre. Au lieu de cela, je veux que le contrôle devienne 300x300 (Math.Min (500, 300) = 300). – SuprDewd

1

Je pense que la solution la plus simple consiste à définir la taille de votre UserControl à une valeur constante où Height == Width, puis déposez le tout dans un Viewbox qui va gérer la mise à l'échelle (tout en maintenant un rapport de spect) pour vous.

<Viewbox> 
    <myLib:UserControl1 x:Name="userControl11" /> 
</Viewbox> 

Cela ne signifie pas que votre commande sera « tendue » plutôt que d'être redimensionnée, ce qui pourrait rendre inapproprié pour vous, mais il est facile à mettre en œuvre!

Questions connexes