6
votes

Comment obtenir la largeur / la hauteur d'un contrôle effondré dans WPF?

Je me demande si there un moyen facile d'obtenir la largeur d'un contrôle de WPF au moment de l'exécution alors que le contrôle est effondré.

Quand j'utilise Control.Width, je vais obtenir le résultat suivant: -1. # ind et contrôle.actualWidth reviendra 0,0 parce que son effondré.

Je veux redimensionner ma fenêtre puis afficher la commande effondrée.

merci

EDIT:
Quelques détails

J'ai une grille avec 2 colonnes dans ma fenêtre, la 1ère colonne contient une commande de tabulation, la 2ème colonne contient un contrôle d'extension. Je souhaite étendre la largeur de ma fenêtre lors de l'expansion du contrôle de l'extension, le contenu de la 1ère colonne restera sa taille.


4 commentaires

Pourquoi doit-il être fait de cette façon? Vous ne pouvez pas simplement afficher le contrôle puis le redimensionner?


Je ne connais pas vraiment WPF, mais pouvez-vous définir la visibilité sur FALSE puis développer et prendre la largeur / la hauteur?


@Simonbesner Je pensais faire de cette façon, mais pour moi, c'est plus une solution de contournement et non le «droit»;) et cette approche a une inconvénient: disons que j'ai un contrôle d'expandeur et sur l'événement élargi, affichez malade de la grille et redimensionner la fenêtre directement après cela. Le Windowsize ne changera pas la première fois que je fais cela. Je ne sais pas pourquoi c'est comme ça, mais je l'ai testé.


Désolé d'avoir causé la confusion que le sizétocontent doit être réglé sur Widthandheight.


6 Réponses :


0
votes

Quelle taille vous attendez-vous à obtenir?

La taille ne dépend pas du contrôle, mais également de son conteneur. La taille réelle ne peut donc pas être déterminée que si le contrôle est effectivement rendu.

Au lieu d'utiliser effondré, vous pouvez le rendre invisible de cette façon, il sera dimensionné par sa propre logique et la logique du conteneur.

Modifier

Dans les commentaires, il est devenu évident que la raison pour laquelle la raison devait avoir besoin de la taille du contrôle:

J'ai une grille avec 2 colonnes dans mon fenêtre, la 1ère colonne contient un onglet Contrôle, la 2e colonne A tient un Contrôle d'expandre. Je veux prolonger le largeur de ma fenêtre lors de l'expansion du contrôle d'expander, donc le contenu de La 1ère colonne restera sa taille.

Ma réponse:

Définissez le sizétocontent de la fenêtre sur WidthandHeight et définissez la largeur des deux colonnes de grille sur Auto. Cela devrait s'en occuper.


7 commentaires

Lorsque vous cachez le contrôle, il réservera son espace dans la mise en page. c'est pourquoi je l'effondre.


Je ne sais pas :( Je pensais qu'il pourrait y avoir un moyen d'obtenir la taille estimée. Donc, je suppose que je ne peux utiliser que des solutions de contournement comme afficher la commande une fois et enregistrer la taille dans une variable ou avoir la commande expansée / visible par défaut.


Même lorsque vous appelez la méthode getDesiredsize msdn.microsoft.com/en-us/library /ee433806.aspx plusieurs fois, il ne sera pas en mesure de dire la taille exacte car le parent détermine la taille réelle. Vous pouvez rapidement le montrer et le cacher à nouveau. BTW: Qu'est-ce que tu essayes de faire? Peut-être que vous approchez-vous du mauvais angle.


J'ai une grille avec 2 colonnes dans ma fenêtre, la 1ère colonne contient une commande de tabulation, la 2ème colonne A contient un contrôle d'extension. Je souhaite étendre la largeur de ma fenêtre lors de l'expansion du contrôle de l'extension, le contenu de la 1ère colonne restera sa taille.


Définissez le sizétocontent de la fenêtre sur true et définissez la largeur des deux colonnes de grille sur Auto. Cela devrai prendre soin de ça.


Vous avez raison. Réglage du sizétocontent a fait l'affaire. aurait dû vous dire des gars ce que je tente de réaliser en premier lieu. Merci


Aucun problème. Je vais ajouter cette solution à ma réponse car la creuse dans les commentaires n'est pas très amusante pour les autres. Peut-être devriez-vous également ajouter la question actuelle à votre question.



1
votes

Mettez le contrôle en question à l'intérieur d'un conteneur (comme un contentcontrol ) et réduisez le conteneur plutôt que le contrôle lui-même. Ensuite, vous devriez être capable d'appeler simplement mesurer (ou utilisez la propriété désiré ) sur le contrôle pour déterminer la quantité de pièce qu'il veut.


0 commentaires

0
votes

Je crois que vous allez à ce sujet le mauvais sens. Vous pouvez définir la largeur de la fenêtre et la hauteur sur "auto" , puis il prendra soin de toutes les trucs de redimensionnement.

Le problème se pose chaque fois que vous définissez directement la propriété de largeur de tout contrôle (croyez-moi que je l'ai fait). Une fois que vous faites cela, vous avez dit à WPF mains libres de la logique de redimensionnement, je sais ce que je fais.

Si vous pensez que quelque chose ne redimensionne pas au bon moment, vous pouvez ajouter un gestionnaire à un événement, puis appelez contrôle.invalidateVisual () ou contrôle.invalidateMesure () qui le fera passer par une nouvelle passe de mise en page.


2 commentaires

Pour définir la hauteur et la largeur d'une fenêtre sur Auto: Définissez le sizétocontent de la fenêtre sur true


@Erno bon point, vous devez non seulement définir la largeur et la hauteur sur "auto" mais aussi sizétocontent = "widthandheight"



0
votes

Vous devez appeler la méthode UpdateLayout sur le contrôle ou le conteneur de contrôle. Après cela, les choses peuvent fonctionner correctement.


0 commentaires

0
votes

Dans UWP, vous pouvez déterminer la taille de la commande effondrée en le rendant visible pour une seconde, puis la masquant à nouveau, le changement n'est pas perceptible:

var oldVisibility = myBorder.Visibility;
myBorder.Visibility = Visibility.Visible;
myBorder.UpdateLayout();
var height = myBorder.RenderSize.Height;
myBorder.Visibility = oldVisibility;


0 commentaires

0
votes

POST qui est marqué comme une réponse ne répond pas à la question, cela donne simplement une solution de contournement.

Pour obtenir la taille du contrôle effondré dont vous avez besoin:

  1. Définir la visibilité du contrôle comme masqué (effondré n'évaluera pas).
  2. Mesure d'appel (NOUVEAU TAILLE (DOUBLE. POSITIMIININININITYIINYIINALIINALININITÉSIMINÉTÉS)) Méthode de contrôle.
  3. Obtenez la taille de la propriété désirée du contrôle.
  4. alors vous pouvez réduire votre contrôle.

0 commentaires