Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 无法以编程方式(甚至通过Snoop)设置WPF中动画控件的宽度或高度_C#_Wpf_Animation - Fatal编程技术网

C# 无法以编程方式(甚至通过Snoop)设置WPF中动画控件的宽度或高度

C# 无法以编程方式(甚至通过Snoop)设置WPF中动画控件的宽度或高度,c#,wpf,animation,C#,Wpf,Animation,这可能与动画有关。我有一个WPF控件,我正在通过几个不同的故事板为其宽度和高度设置动画。我创建故事板,然后对其调用Begin()。我已经为下面的故事板提供了代码 我想重新评估某个事件的控件大小(例如,调整窗口大小),使其与设置动画的值不同。我试图通过设置控件的Width和Height属性来处理手动更改的大小(在动画运行后)。调试器显示未设置这些值(保留原始值) 当我通过Snoop检查WPF时,Width和Height行以桃红色/橙色突出显示,并且再次尝试通过它设置值不会保持不变(当我将焦点移开时

这可能与动画有关。我有一个WPF控件,我正在通过几个不同的故事板为其宽度和高度设置动画。我创建故事板,然后对其调用Begin()。我已经为下面的故事板提供了代码

我想重新评估某个事件的控件大小(例如,调整窗口大小),使其与设置动画的值不同。我试图通过设置控件的
Width
Height
属性来处理手动更改的大小(在动画运行后)。调试器显示未设置这些值(保留原始值)

当我通过Snoop检查WPF时,Width和Height行以桃红色/橙色突出显示,并且再次尝试通过它设置值不会保持不变(当我将焦点移开时,会显示原始值。我的猜测是,我的动画以某种方式覆盖了对属性的手动更改,但我不确定这是否为真或如何解决它

故事板类

public class MyAnimationClass
{
    private Storyboard _myStoryboard;
    private DoubleAnimation _animation1;
    private DoubleAnimation _animation2;
    private DoubleAnimation _animation3;

    private void InitializeStoryboard()
    {
        _myStoryboard = CreateMyStoryboard(out _animation1, out _animation2, out _animation3);
    }

    private Storyboard CreateMyStoryboard(out DoubleAnimation animation1, out DoubleAnimation animation2, out DoubleAnimation animation3)
    {
        var myStoryboard = new Storyboard();

        // create animations
        animation1 = new DoubleAnimation { Duration = new TimeSpan(0, 0, 0, 0, 250), From = 0, To = 0 };
        animation2 = new DoubleAnimation { BeginTime = new TimeSpan(), Duration = new TimeSpan(0, 0, 0, 0, 250), From = 35, To = 35 };
        animation3 = new DoubleAnimation { BeginTime = new TimeSpan(0, 0, 0, 0, 250), Duration = new TimeSpan(0, 0, 0, 0, 250), From = 35, To = 0 };

        Storyboard.SetTargetProperty(animation1, new PropertyPath(FrameworkElement.WidthProperty));
        Storyboard.SetTargetProperty(animation2, new PropertyPath(FrameworkElement.HeightProperty));
        Storyboard.SetTargetProperty(animation3, new PropertyPath(FrameworkElement.HeightProperty));

        myStoryboard.Children.Add(animation1);
        myStoryboard.Children.Add(animation2);
        myStoryboard.Children.Add(animation3);

        return myStoryboard;
    }

    public void Animate(Control controlToAnimate)
    {
        // ....

        var finalWidth = CalculateFinalWidth();
        var finalHeight = CalculateFinalHeight();

        _animation1.To = finalWidth;
        _animation3.To = finalHeight;
        _myStoryboard.Begin(controlToAnimate);
    }
}
当我想要为某个对象设置动画时,我在我的
MyAnimationClass
类的实例上调用
animate()


想法?

这是一个非常简单的解决方案。由于
FillBehavior
控制属性值,因此该值没有更改。但是,简单地将其更改为
FillBehavior.Stop
并不能解决我的问题,因为当我的非动画代码设置宽度/高度时,下次运行动画时,它将以动画形式显示我想要的宽度/高度,然后默认返回到设置的高度。这通过在计算后和动画之前设置控件的宽度/高度来解决:

public void Animate(Control controlToAnimate)
{
    // ....

    var finalWidth = CalculateFinalWidth();
    var finalHeight = CalculateFinalHeight();

    // set values here so after animation they stay
    controlToAnimate.Width = finalWidth;
    controlToAnimate.Height = finalHeight;

    _animation1.To = finalWidth;
    _animation3.To = finalHeight;
    _myStoryboard.Begin(controlToAnimate);
}

在我看来,您需要先停止这些故事板。@HighCore啊,我以为它是自动停止的。我刚刚找到这篇MSDN文章,它告诉我需要将FillBehavior设置为stop,以使其在完成时停止:嗯,如果我将FillBehavior设置为stop,然后调整窗口大小(这会触发设置控件的宽度和高度,调用UpdateLayout并在控件上调用InvalidateVisual)动画不再设置为所需的宽度和高度,而是由“调整大小”设置的宽度和高度。我是否需要为每个动画创建一个新的故事板?您想做什么?通常不需要处理“窗口调整大小”事件。我想在手动调整窗口大小时调整控件的大小。基本上,当我执行操作时但在那之后,我希望手动处理控件的尺寸(通过设置宽度和高度)。但是,当我再次运行动画时,我希望它跨计算值而不是我设置的宽度和高度设置动画。似乎如果我将FillBehavior设置为Stop,则宽度和高度为Double.NaN。当我手动设置宽度和高度时,将设置这些值并忽略动画值。