2010-09-21 5 views
0

Ok,Suppression de la transformation de rendu d'un élément enfant

J'ai donc une situation dans laquelle une bordure est mise à l'échelle (parfois de façon importante) et traduite. A l'intérieur de la bordure est une grille, et à l'intérieur de la grille sont deux images, une est une photo et est étiré à la taille de la frontière, et l'autre, je veux être une icône, qui doit être une taille fixe dans le bas le coin à gauche.

Le problème est que je veux supprimer l'effet de l'échelle sur l'icône. C'est parce que j'ai donné à l'icône une taille fixe et je voudrais qu'il reste de cette taille, mais malheureusement, la mise à l'échelle de la frontière se propage sur les enfants de la frontière et les affecte également.

J'ai donc essayé d'utiliser une propriété attachée, similaire à celle de l'accrochage aux pixels (http://blogs.msdn.com/b/devdave/archive/2008/06/22/using-an-attached-dependencyproperty-to-implement-pixel-snapping-as-an-attached-behavior.aspx), mais cela ne semble pas faire de différence. Une fois franchi, les éléments en cours de modification dans LayoutUpdate semblent toujours avoir la matrice d'identité pour la transformation de rendu, avant que je l'ai définie.

Je suppose que je suis moche-interperating comment les transformations de rendu sont appliquées aux enfants peut-être?

Quoi qu'il en soit, voici ce que j'ai (Aussi, je sais (si cela a fonctionné) supprimerait aussi la traduction, ce qui est pas ce que je veux!):

public static readonly DependencyProperty IsConstantSizeProperty = 
     DependencyProperty.RegisterAttached(
     "ConstantWidth", 
     typeof(bool), 
     typeof(ItemsControlEX), 
     new PropertyMetadata(new PropertyChangedCallback(IsConstantSizeChanged))); 

    private static List<FrameworkElement> m_constSizeObjects = new List<FrameworkElement>(); 

    private static void IsConstantSizeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     bool isConstantWidth = (bool)args.NewValue; 
     if (isConstantWidth) 
     { 
      FrameworkElement el = (FrameworkElement)obj; 
      m_constSizeObjects.Add(el); 

      el.LayoutUpdated += new EventHandler(el_LayoutUpdated); 
      el.Unloaded += new RoutedEventHandler(el_Unloaded); 
     } 
    } 

    static void el_Unloaded(object sender, RoutedEventArgs e) 
    { 
     FrameworkElement el = (FrameworkElement)sender; 
     el.Unloaded -= new RoutedEventHandler(el_Unloaded); 
     el.LayoutUpdated -= new EventHandler(el_LayoutUpdated); 

     m_constSizeObjects.Remove(el); 
    } 

    static void el_LayoutUpdated(object sender, EventArgs e) 
    { 
     foreach (FrameworkElement el in m_constSizeObjects) 
     { 
      MatrixTransform trans = new MatrixTransform(); 
      trans.Matrix = Matrix.Identity; 
      el.RenderTransform = trans; 
     } 
    } 

    public static void SetIsConstantWidth(UIElement element, Boolean value) 
    { 
     element.SetValue(IsConstantSizeProperty, value); 
    } 

    public static Boolean GetIsConstantWidth(UIElement element) 
    { 
     return (Boolean)element.GetValue(IsConstantSizeProperty); 
    } 

Je pense que je » Je pense probablement à cela de manière complètement erronée. Je suppose que la solution raisonnable serait de refactoriser pour éliminer le besoin de mise à l'échelle, mais je suppose que j'étais juste après une solution plus rapide que je peux utiliser jusqu'à ce que j'ai le temps.

Toute aide est appréciée! :)

Merci!

Andy.

Répondre

0

Si vous ne faites que de la mise à l'échelle (j'assume le format d'image fixe) qui semble trop compliqué, pourquoi ne pas placer la photo dans un conteneur ViewBox? Placez la ViewBox (contenant la photo) et l'icône (dans cet ordre) dans une grille parente.

  • Faire l'icône par rapport à la en bas à gauche en utilisant l'alignement et la marge paramètres
  • Redimensionner négatoscope à l'échelle de l'image.

La grille rétrécira pour s'adapter à la taille de la vue. L'icône restera relative à la grille en bas à gauche.

Votre comportement d'alignement des pixels devrait fonctionner sur une ViewBox.

Si vous avez besoin d'un exemple spécifique, veuillez fournir une partie de votre Xaml à partir de.

+0

Wow, j'ai tout oublié à propos de ViewBox! C'est toujours les solutions simples qui sont oubliées! D'une manière ou d'une autre, j'ai supprimé le besoin d'écailler, alors j'ai résolu le problème de cette façon! Plus rapide que je l'imageai! :) Je serais toujours intéressé à lire plus en détail sur la façon dont les transformations sont propagées aux enfants, juste par intérêt, si vous avez des connaissances/liens? – Andy

+0

@Andy: Contrairement au rendu 3D réel, il fonctionne efficacement de bas en haut. Imaginez juste que chaque contrôle enfant est juste un bitmap. Il a ensuite la prochaine transformation qui lui est appliquée par le parent.Rincez et répétez jusqu'à ce que vous atteigniez le haut de l'arbre de rendu :) –

Questions connexes