C# 在SizeChanged事件上调整动画大小不会';它不能正常工作
当stackpanel visibility设置为visible状态时,我想要一个调整大小的动画,但相反,我得到的是包含stackpanel的边框不会不断闪烁。我认为我没有做错。 堆栈面板包含TextBlock的一个实例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
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();
}
}