2010-07-01 39 views
0

我在學習WPF並有一個特定的目標。假設你有一個網格(3行3列)和一個控件,比如一個簡單的藍色矩形填充中間的單元格。當我點擊單元格時,我想讓方塊平滑地旋轉180度。WPF,在容器邊界上動畫

我現在的具體問題是;當矩形旋轉時,它不會改變它的尺寸,所以它會延伸到單元的邊界之外。我不希望它夾住,我希望它出現在頂部,部分遮蓋周圍的細胞。

第二部分是,如果有一個單元格填充整個窗口,並且單擊該單元格中的藍色矩形,我可以使矩形旋轉並超出窗體兩側的範圍嗎?

如果沒有意義,請詢問。我發現很難谷歌,因爲我不知道我應該使用的確切條款。

謝謝

+0

我想你想要一個ScaleTransform。 – Reddog 2010-07-02 00:13:38

回答

1

第一部分可以通過使用附加屬性Panel.ZIndex被acomplished,將其設置爲較高的值,當你啓動動畫和較低的值在動畫完成時。第二部分(在窗口外面有一個控件)更加複雜。我嘗試了一些東西,這種方法似乎是最好的。當我遇到剪輯問題時,它使用全屏窗口而不是Popup。該元素的副本使用RenderTargetBitmap製作,然後放置在相同的位置。原始元素在複製動畫時隱藏。

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(); 
}