2010-07-01 8 views
0

J'apprends WPF et j'ai un objectif spécifique. Imaginez que vous ayez une grille (3 lignes sur 3 colonnes), et qu'un contrôle, par exemple un simple rectangle bleu remplisse la cellule du milieu. Lorsque je clique sur la cellule, je veux que le carré tourne doucement de 180 degrés.WPF, animer sur les limites des conteneurs

Le problème spécifique que j'ai en ce moment est; lorsque le rectangle tourne, il ne changera pas ses dimensions, il s'étendra donc au-delà de la limite de la cellule. Je ne veux pas qu'il se clipse, je veux qu'il apparaisse en haut, obscurcissant partiellement les cellules environnantes. La deuxième partie de ceci est, s'il y a une cellule qui remplit la fenêtre entière, et je clique sur le rectangle bleu dans cette cellule, puis-je faire tourner le rectangle et s'étendre au-delà des côtés du formulaire?

Si cela n'a pas de sens, s'il vous plaît demander. J'ai du mal à google parce que je ne connais pas les termes exacts que je devrais utiliser.

Merci

+0

Je pense que vous voulez un ScaleTransform. – Reddog

Répondre

1

La première partie peut être acomplished en utilisant la propriété attachée Panel.ZIndex, elle a mis à une valeur élevée lorsque vous démarrez l'animation et une valeur inférieure lorsque l'animation est terminée. La deuxième partie (ayant un contrôle à l'extérieur de la fenêtre) est plus compliquée. J'ai essayé quelques trucs et cette méthode semblait être la meilleure. Il utilise une fenêtre plein écran au lieu d'un Popup que j'ai rencontré des problèmes de clip. Une copie de l'élément est faite en utilisant RenderTargetBitmap, celle-ci est alors placée dans la même position. L'élément d'origine est masqué lorsque la copie est animée.

public void PopupAnimation(UIElement element) 
{ 
    double w = element.RenderSize.Width,h = element.RenderSize.Height; 
    var screen = new Canvas(); 
    var pos = element.PointToScreen(new Point(0, 0)); 
    var rtb = new RenderTargetBitmap((int)w,(int)h, 96, 96, PixelFormats.Pbgra32); 
    rtb.Render(element); 
    Image i = new Image { Source = rtb, Width = w, Height = h,Stretch=Stretch.Fill}; 
    Canvas.SetLeft(i, pos.X); 
    Canvas.SetTop(i, pos.Y); 
    screen.Children.Add(i); 

    var window = new Window() { 
     Content = screen, AllowsTransparency = true, 
     Width=SystemParameters.PrimaryScreenWidth,Height=SystemParameters.PrimaryScreenHeight, 
     WindowStyle=WindowStyle.None,ShowInTaskbar=false,Topmost=true, 
     Background=Brushes.Transparent,ShowActivated=false,Left=0,Top=0 
    }; 
    var transform = new RotateTransform(); 
    i.RenderTransformOrigin = new Point(0.5, 0.5); 
    i.RenderTransform = transform; 

    var anim = new DoubleAnimation { To = 360 }; 
    anim.Completed += (s,e) => 
    { 
     element.Visibility = Visibility.Visible; 
     var delay = new Storyboard { Duration = TimeSpan.FromSeconds(0.1) }; 
     delay.Completed += (s2, e2) => window.Close(); 
     delay.Begin(); 
    }; 

    window.ContentRendered += (s, e) => 
    { 
     transform.BeginAnimation(RotateTransform.AngleProperty, anim); 
     element.Visibility = Visibility.Hidden; 
    }; 
    window.Show(); 
} 
Questions connexes