Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF,在容器边界上设置动画_C#_Wpf_Wpf Controls - Fatal编程技术网

C# WPF,在容器边界上设置动画

C# WPF,在容器边界上设置动画,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我正在学习WPF,并且有一个明确的目标 假设您有一个网格(3行3列)和一个控件,例如一个简单的蓝色矩形填充中间的单元格。当我点击单元格时,我想让正方形平滑地旋转180度 我目前的具体问题是,;当矩形旋转时,它不会改变其尺寸,因此它将延伸到单元边界之外。我不希望它被剪辑,我希望它出现在顶部,部分遮挡周围的细胞 第二部分是,如果有一个单元格填充整个窗口,我单击该单元格中的蓝色矩形,我可以使该矩形旋转并延伸到窗体的边之外吗 如果这不合理,请询问。我发现谷歌搜索很难,因为我不知道我应该使用的确切术语 谢

我正在学习WPF,并且有一个明确的目标

假设您有一个网格(3行3列)和一个控件,例如一个简单的蓝色矩形填充中间的单元格。当我点击单元格时,我想让正方形平滑地旋转180度

我目前的具体问题是,;当矩形旋转时,它不会改变其尺寸,因此它将延伸到单元边界之外。我不希望它被剪辑,我希望它出现在顶部,部分遮挡周围的细胞

第二部分是,如果有一个单元格填充整个窗口,我单击该单元格中的蓝色矩形,我可以使该矩形旋转并延伸到窗体的边之外吗

如果这不合理,请询问。我发现谷歌搜索很难,因为我不知道我应该使用的确切术语


谢谢

第一部分可以通过使用附加属性来完成,在启动动画时将其设置为高值,在动画完成时将其设置为低值。第二部分(在窗口外有一个控件)更复杂。我尝试了一些方法,这种方法似乎是最好的。当我遇到剪贴问题时,它使用全屏窗口而不是屏幕。使用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();
}

我想你需要一个ScaleTransform。