WPF动画代码中,用什么替换Grid以支持Button、Image等所有窗体元素?
我已经写了一段可以正常运行的WPF动画代码,但目前它只支持Grid控件,我希望这段代码能支持Button、Image等所有窗体元素。请问当前代码里的
Thickness to_margin = (element as Grid).Margin;这一行的Grid类型应该替换成什么?
原代码:
private void baslangic_gridler(UIElement element) { DoubleAnimation opaklk = new DoubleAnimation(); opaklk.From = 0; opaklk.To = 1; opaklk.Duration = new TimeSpan(0, 0, 0, 0, 300); Thickness to_margin = (element as Grid).Margin; Thickness from_margin = to_margin; from_margin.Left = from_margin.Left - 25; ThicknessAnimation kaydır = new ThicknessAnimation(); kaydır.From = from_margin; kaydır.To = to_margin; kaydır.Duration = new TimeSpan(00,0,0,0,300); element.BeginAnimation(MarginProperty, kaydır); element.BeginAnimation(OpacityProperty, opaklk); }
嘿,这个问题很好解决!你需要把Grid替换成**FrameworkElement**。
为什么选它?原因很简单:
FrameworkElement是所有WPF布局类控件的基类,Button、Image、Grid、TextBox这些常用可视化元素,全都直接或间接继承自它。Margin这个布局属性本身就是定义在FrameworkElement中的,并不是Grid独有的特性。
另外,为了代码更健壮,建议加上一个null检查,避免传入的element不是FrameworkElement的情况(虽然常规可视化控件基本不会出现这种情况,但加上能避免空引用异常)。
修改后的完整代码如下:
private void baslangic_gridler(UIElement element) { var frameworkElement = element as FrameworkElement; if (frameworkElement == null) return; // 转换失败时直接返回,避免空引用 DoubleAnimation opaklk = new DoubleAnimation(); opaklk.From = 0; opaklk.To = 1; opaklk.Duration = new TimeSpan(0, 0, 0, 0, 300); Thickness to_margin = frameworkElement.Margin; Thickness from_margin = to_margin; from_margin.Left = from_margin.Left - 25; ThicknessAnimation kaydır = new ThicknessAnimation(); kaydır.From = from_margin; kaydır.To = to_margin; kaydır.Duration = new TimeSpan(0, 0, 0, 0, 300); element.BeginAnimation(MarginProperty, kaydır); element.BeginAnimation(OpacityProperty, opaklk); }
这样修改后,你的动画方法就能支持所有继承自FrameworkElement的控件了,完全满足你的需求~
内容的提问来源于stack exchange,提问作者Berkoo
相关产品推荐
相关产品推荐

