Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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# 在SizeChanged事件上调整动画大小不会';它不能正常工作_C#_Silverlight_Windows Phone 7 - Fatal编程技术网

C# 在SizeChanged事件上调整动画大小不会';它不能正常工作

C# 在SizeChanged事件上调整动画大小不会';它不能正常工作,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,当stackpanel visibility设置为visible状态时,我想要一个调整大小的动画,但相反,我得到的是包含stackpanel的边框不会不断闪烁。我认为我没有做错。 堆栈面板包含TextBlock的一个实例 private void MyBorder_SizeChanged_1(object sender, SizeChangedEventArgs e) { if (!first) { DoubleAnimation anim = new Doubl

当stackpanel visibility设置为visible状态时,我想要一个调整大小的动画,但相反,我得到的是包含stackpanel的边框不会不断闪烁。我认为我没有做错。 堆栈面板包含TextBlock的一个实例

private void MyBorder_SizeChanged_1(object sender, SizeChangedEventArgs e)
{
    if (!first)
    {
        DoubleAnimation anim = new DoubleAnimation();
        anim.From = e.PreviousSize.Height;
        anim.To = e.NewSize.Height;
        anim.Duration = new Duration(TimeSpan.FromSeconds(1));
        Storyboard.SetTarget(anim, MyBorder);
        Storyboard.SetTargetProperty(anim, new PropertyPath(Border.HeightProperty));
        Storyboard st = new Storyboard();
        st.Children.Add(anim);
        st.Begin();
    }
    first = false;
}

private void MyBorder_Tap_1(object sender, GestureEventArgs e)
{
    if (MyPanel.Visibility == Visibility.Collapsed)
        MyPanel.Visibility = Visibility.Visible;
    else
        MyPanel.Visibility = Visibility.Collapsed;
}

问题是,当您设置边框高度的动画时,它将触发SizeChanged事件,因此您有一个循环:size changed event>animate height>size changed event>
此外,当“大小更改”事件被激发时,大小更改已被放置,因此即使该更改有效,您也会在它返回动画时得到一点轻弹
最后,在动画中使用高度强制渲染更新,这样就不会加速硬件。 最好是进行平移变换或缩放变换。

例如,您可以在点击事件中直接在MyPanel上进行0到1之间的缩放变换。

这可能有助于您实现。这是一种变通办法

private void MyBorder_SizeChanged_1(object sender, SizeChangedEventArgs e)
    {
        if (!first)
        {
            DoubleAnimation anim = new DoubleAnimation();
            anim.From = e.PreviousSize.Height;
            anim.To = e.NewSize.Height;
            anim.Duration = new Duration(TimeSpan.FromSeconds(1));
            Storyboard.SetTarget(anim, MyBorder);
            Storyboard.SetTargetProperty(anim, new PropertyPath(Border.HeightProperty));
            Storyboard st = new Storyboard();
            st.Children.Add(anim);
            st.Completed += st_Completed;
            MyBorder.SizeChanged -= MyBorder_SizeChanged_1;
            st.Begin();

        }
        first = false;
    }

    void st_Completed(object sender, EventArgs e)
    {
        MyBorder.SizeChanged += MyBorder_SizeChanged_1;
    }

    private void MyBorder_Tap_1(object sender, GestureEventArgs e)
    {
        if (MyPanel.Visibility == Visibility.Collapsed)
            MyPanel.Visibility = Visibility.Visible;
        else
            MyPanel.Visibility = Visibility.Collapsed;


    }

考虑到即使在情节提要中,边框也在调整大小,最好删除大小更改的事件。尝试在chld size上设置父容器的动画,更改了一些类似的内容

我已经解决了这个问题。愚蠢的我,我认为StackPanel的度量方法是私有的,并没有费心去确定它,下面是单击扩展StackPanel的解决方案代码。


现在边框展开并立即缩小,然后动画开始。但我会尝试修复它。一种修复方法是尝试一些可能奏效的方法:)尝试在鼠标左键向上发射,而不是改变大小。:)无论在哪里发射,都会得到相同的结果。最后,如果没有其他办法,我将使用自己的StackPanel。好的,还有一个建议:)尝试在鼠标左键向上时使边框折叠,并在.Begin()调用之前使其可见,以便可以立即获取边框。
private void MyBorder_Tap_1(object sender, GestureEventArgs e)
{
    if (MyPanel.Visibility == Visibility.Collapsed)
    {
        MyPanel.Visibility = Visibility.Visible;
        MyPanel.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
        DoubleAnimation anim = new DoubleAnimation();
        anim.From = MyBorder.ActualHeight;
        anim.To = MyBorder.ActualHeight + MyPanel.DesiredSize.Height;
        anim.Duration = new Duration(TimeSpan.FromSeconds(0.25));
        Storyboard.SetTarget(anim, MyBorder);
        Storyboard.SetTargetProperty(anim, new PropertyPath(Border.HeightProperty));
        Storyboard st = new Storyboard();
        st.Children.Add(anim);
        st.Begin();
    }
    else
    {
        MyPanel.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
        DoubleAnimation anim = new DoubleAnimation();
        anim.From = MyBorder.ActualHeight;
        anim.To = MyBorder.ActualHeight - MyPanel.DesiredSize.Height;
        anim.Duration = new Duration(TimeSpan.FromSeconds(0.25));
        Storyboard.SetTarget(anim, MyBorder);
        Storyboard.SetTargetProperty(anim, new PropertyPath(Border.HeightProperty));
        Storyboard st = new Storyboard();
        st.Children.Add(anim);
        st.Completed += (a,b) => { MyPanel.Visibility = Visibility.Collapsed; };
        st.Begin();
    }
}