2010-08-31 6 views
7

J'ai une fenêtre WPF avec panneau extensible (via Expander). Le panneau se trouve sur le côté gauche de la fenêtre et, une fois développé, la fenêtre s'agrandit pour s'adapter au contenu. Par défaut, les fenêtres sont ancrées en haut à gauche, de sorte que ma fenêtre se développe vers la droite. J'aimerais que la fenêtre se développe vers la gauche.WPF - Développer la fenêtre vers la gauche

J'ai essayé de faire ce qui suit en cas Window.SizeChanged:

private void onWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    Left -= (e.NewSize.Width - e.PreviousSize.Width) 
} 

et il fonctionne, mais la croissance est saccadé, et je voudrais trouver une solution plus lisse.

+0

Je joue avec votre solution actuelle, et il semble aussi avoir des problèmes. Si vous redimensionnez avec la poignée de la fenêtre (c'est-à-dire si vous n'utilisez pas l'Expander), le redimensionnement est vraiment saccadé. De mon côté, le fait de redimensionner la fenêtre brise aussi le code de redimensionnement de la fenêtre et ne s'étendra plus vers la gauche. – Dave

Répondre

4

j'ai réussi à surmonter cette aide d'une solution simple: Hide & Show.

Voici le code:

protected override void OnRenderSizeChanged(SizeChangeInfo sizeInfo) 
{ 
    if (!sizeInfo.WidthChanged) 
    { 
     base.OnRenderSizeChanged(sizeInfo); 
     return; 
    } 
    Hide(); 
    base.OnRenderSizeChanged(sizeInfo); 
    Left -= (sizeInfo.NewSize.Width - sizeInfo.PreviousSize.Width); 
    Show(); 
} 

I a remplacé le gestionnaire d'événements pour Window.SizeChanged avec cette substitution de FrameworkElement.OnRenderSizeChanged.

0

Vous pouvez mettre votre expandeur dans une grille (où la taille de la colonne peut changer), puis définir la propriété ExpandDirection de votre expander à gauche?

+0

Je veux que * Window * croisse vers la gauche. L'expandeur est en train de pousser vers la gauche, mais les fenêtres sont redimensionnées pour s'adapter au contenu de droite (donc tout bouge). –

1

Solution 1

Essayez d'utiliser la propriété de fenêtre: SizeToContent = « largeur » cela échelle la fenêtre à la taille de votre contenu et vous pouvez faire évoluer votre contenu en utilisant l'animation et l'assouplissement, ce qui rendra l'échelle de la fenêtre est belle et lisse.

Solution 2

Vous pouvez créer une fenêtre qui est plus grand que son contenu et rendre votre fond transparent. Vous devez toujours ajouter un arrière-plan à un élément.

Voici un exemple de la façon dont il peut ressembler à: example image

+0

La solution 1 entraînera toujours le redimensionnement de la fenêtre vers la gauche, non? Et la solution 2 est sympa mais je ne serai pas capable d'utiliser une fenêtre régulière avec une barre de titre. Je vais devoir imiter ça moi-même. –

2

Je ne l'ai pas essayé de faire une fenêtre pousser vers la gauche comme ce que vous demandez, mais si tout le reste échoue, je considérerais modéliser un bouton pour ressembler au bouton d'extension. Ensuite, au lieu d'essayer de faire évoluer votre fenêtre vers la gauche, créez une nouvelle fenêtre à gauche de votre fenêtre principale à l'aide de Transforms.

MISE À JOUR

Eh bien, les pauvres performances de rendu pourrait être une carte vidéo liée, la mise en page (trop complexe) lié, ou les deux. J'ai une idée qui pourrait faire l'affaire pour vous. Jeff Prosise a blogué sur une loupe en Silverlight qui utilise un WriteableBitmap pour obtenir l'effet désiré. J'ai pensé, "pourquoi ne pas utiliser un WriteableBitmap pour créer une capture d'écran de votre mise en page à la droite de l'Expander, et couvrir les autres éléments avec?". Je pense que si vous faites cela et que vous cachez les éléments sous-jacents (donc ils ne sont pas ajustés), les performances de rendu seront grandement améliorées. J'ai eu le code de Jeff pour travailler dans WPF avec peu de modifications.

http://www.wintellect.com/CS/blogs/jprosise/archive/2009/10/29/more-fun-with-silverlight-3-s-writeablebitmap.aspx

+0

Je n'ai pas compris votre suggestion. Pouvez-vous élaborer s'il vous plaît? –

+0

@Omer bien, * si * Je comprends bien votre situation, vous avez un expandeur qui s'ouvre vers la gauche. Mais quand vous faites cela, la fenêtre se redimensionne vers la droite et tout le contenu se déplace, ce qui, je suppose, vous semble un peu saccadé. Si vous gardez la fenêtre entière * intacte *, il n'a jamais besoin de redimensionner ses enfants. Vous pourriez simuler cet effet en utilisant un bouton qui ressemble à un expandeur, mais lorsque vous cliquez dessus, le gestionnaire pourrait créer une fenêtre complètement séparée à gauche de la fenêtre principale, ce qui éviterait tout le problème de redimensionnement. Et vous pouvez le rendre animé. – Dave

+0

Ok, je comprends - mais c'est un hack avec un effet secondaire: le résultat final ne ressemblera pas à une seule fenêtre (avec une seule barre de titre). Je suis à la recherche d'une solution qui me donnera une seule fenêtre. –

Questions connexes