2009-11-18 3 views

Répondre

7

Je ne suis pas sûr que cela fonctionnera, mais si vous enregistrez un gestionnaire pour l'événement SizeChanged et là dans votre code garder le rapport d'aspect 1: 1.

L'argument SizeChangedEventArgs a l'ancienne taille et la nouvelle taille afin que vous puissiez vérifier ce qui a changé et mettre à jour l'autre en conséquence.

Vous devrez peut-être introduire une variable de garde afin de ne pas avoir une cascade d'événements SizeChanged suite à la mise à jour du Height ou du Width.

+0

Je pense le contrôle clignotera lors du redimensionnement. –

+0

Il ne clignote pas car WPF utilise le mode conservé et le rendu est effectué à une priorité inférieure, de sorte que le rendu verra le résultat final de tous les événements 'SizeChanged'. Exception: Si votre fenêtre est 'SizeToContent' et que sa taille est affectée,' SetWindowPos() 'est appelée immédiatement pendant les calculs, donc vous verrez probablement quelque chose. –

-2
private bool isSizeChangeDefered; 

private void uiElement_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     //Keep Acpect Ratio 
     const double factor = 1.8; 
     if(isSizeChangeDefered) 
      return; 

     isSizeChangeDefered = true; 
     try 
     { 
      if (e.WidthChanged) 
      { 
       driverPan.Height = e.NewSize.Width * factor; 
      } 
      if (e.HeightChanged) 
      { 
       driverPan.Height = e.NewSize.Width/factor; 
      } 
     } 
     finally 
     { 
     // e.Handled = true; 
      isSizeChangeDefered = false; 
     } 
    } 

peut-être cette aide ... hourras

+1

Cette réponse est essentiellement un exemple de la réponse fournie par ChrisF il y a 18 mois. Il semble également incomplet (quelle est la variable driverPan?) Et je crois qu'il y a un problème de logique si les deux height/width sont changés dans le même événement (redimensionner diagonale) –

3

Essayez d'utiliser un ViewBox et sa propriété extensible à Uniform

3

Une autre alternative:

<local:MyControl Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
+0

Cela fonctionne parfaitement pour moi et semble être la réponse la plus simple (bien que je ne comprends pas vraiment ce qu'il fait). – brianberns

+1

@brianberns il lie la propriété 'Width' à la propriété' ActualHeight'. Mais le 'ActualHeight' de quoi? D'une source Relative! Et quelle est la source relative? (elle) Soi! C'est-à-dire, je dis que "je veux que ma propre largeur soit quelque soit la hauteur réelle du système d'agencement calculé pour moi". – heltonbiker

+0

Merci, cela a du sens. BTW, j'ai trouvé un problème avec cette solution: Si seulement la largeur de la fenêtre principale change (par exemple en faisant glisser sa bordure droite dedans ou dehors), le contrôle ne sait pas redimensionner, parce que sa hauteur n'a pas changé. – brianberns

0

i utilisé ce code pour garder aspect ratio

dans usercontrol globalement définir org_width, org_height, org_rat io:

private static double org_width = 77.6;//desired width 
private static double org_height = 81.4;//desired height 

private static double org_ratio = org_width/org_height; 

utiliser ce code à l'intérieur usercontrol en cas SizeChanged:

FrameworkElement UCborder = this; 
UCborder.Width = UCborder.Height*org_ratio; 

et enfin votre code de contrôle utilisateur doit ressembler à ceci:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using System.Windows.Media; 

namespace yournamespace 
{ 
    public partial class YourUserControl : UserControl 
    { 

     private static double org_width = 77.6;//desired width 
     private static double org_height = 81.4;//desired height 

    private static double org_ratio = org_width/org_height; // width/height 



    public YourUserControl() 
    { 
     InitializeComponent(); 
    } 


    private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
      FrameworkElement UCborder = this; 
      UCborder.Width = UCborder.Height*org_ratio; 
    } 
    } 
} 

bonne chance

Questions connexes