2009-11-02 4 views
1

J'ai une grille qui représente certaines données, et j'ai besoin d'une toile pour superposer par-dessus pour mettre en forme certaines lignes. Le canevas est à l'intérieur de son propre contrôleWPF et superposition de canevas

Le problème est que le canevas et son contenu devraient être automatiquement redimensionnés lorsque la grille redimensionne la largeur et la hauteur. J'ai ajouté la toile à l'intérieur d'une boîte de vue, mais cela n'a pas réussi. Lorsque la grille est redimensionnée, la toile ne le fait pas. Le but de la toile est de superposer une fonctionnalité de type règle sur le dessus de la grille.

Je ne peux pas utiliser de style sur la grille pour remplacer le canevas, car la grille affiche des informations différentes de celles du canevas. Pensez-y comme tableau, dans lequel il y a des colonnes de barres de tailles différentes (dans mon cas, la grille) et les jours sont des lignes dans une superposition (comme un graphique Gantt)

Mon code:

taxCanvas = new TimeAxis(); 
Grid.SetRowSpan(taxCanvas, GRightMain.RowDefinitions.Count); 
Grid.SetColumnSpan(taxCanvas, GRightMain.ColumnDefinitions.Count); 
Grid.SetColumn(taxCanvas, 0); Grid.SetRow(taxCanvas, 0); 
Grid.SetZIndex(taxCanvas, -1); 
taxCanvas.Height = GRight.ActualHeight; 
taxCanvas.Width = GRight.ActualWidth; 
GRightMain.Children.Add(taxCanvas); 

TimeAxis est ma commande usercontrol, GRightMain est une grille qui contient à la fois ma toile et la grille avec le contenu (Gright) dans la même ligne et la même colonne.

Répondre

0

Votre contrôle GRightMail est une grille qui, par défaut, étend son contenu. Si vos données et le contrôle TimeAxis sont tous deux dans la même cellule de la grille (et la même ligne/colonne), ils doivent s'étendre ensemble.

Si ce n'est toujours pas le cas, vérifiez que votre TimeAxis n'a pas une largeur ou hauteur fixe ou un alignement horizontal/vertical défini.

1

La cause directe de votre problème est les lignes:

taxCanvas.Height = GRight.ActualHeight; 
taxCanvas.Width = GRight.ActualWidth; 

Ceci définit une taille fixe pour votre contrôle TimeAxis, la désactivation de toute auto-redimensionnement.

En supposant que votre contrôle utilisateur TimeAxis n'a aucun paramètre interne affectant la mesure, le remplacement des paramètres Height et Width par les éléments suivants devrait entraîner le redimensionnement automatique de UserControl.

taxCanvas.HorizontalAlignment = HorizontalAlignment.Stretch; 
taxCanvas.VerticalAlignment = VerticalAlignment.Stretch; 

Ceci peut ne pas résoudre complètement votre problème cependant; La taille et la taille de disposition de votre UserControl seront les mêmes que celles de la grille, mais vous devrez toujours redimensionner manuellement les objets sur votre canevas. Un canevas n'a aucune disposition pour mesurer/organiser, donc vous devrez gérer cela avec du code. Les techniques courantes sont:

  1. Enveloppant le canevas dans une ViewBox que vous avez déjà essayée. Vous pouvez essayer à nouveau avec les lignes ci-dessus modifiées.
  2. Réglage de la RenderTransform de la toile en utilisant le code ou les liaisons (plus efficace que le réglage LayoutTransform et toile ne participe pas à la disposition de toute façon)
  3. Réglage des positions de forme individuelles en utilisant le code ou les liaisons

Un Gotcha à attention: Lorsque vous redimensionnez une toile, son contenu n'est pas affecté. Donc, si vous voulez savoir si votre toile est réellement redimensionnée, donnez-lui une couleur de fond. De cette façon, vous ne perdrez pas de temps à chercher au mauvais endroit pour un problème de dimensionnement.

Questions connexes