WPF动画下降的文本块

时间:2014-11-14 08:49:01

标签: c# wpf xaml

我在WPF做了一个小小的数学游戏,我有一些"下降的文本块"包含在您到达窗口底部之前必须正确回答的乘法。

目前它看起来像这样

Screenshot from the game

我现在正在做的是每个文本块都是一个自定义WPF控件,它包含一个表示表达式的文本块和一个文本框,用户可以在其中输入该表达式的答案。这些是在40x20网格内部生成的,我使用DispatcherTimer将它们连续移动到网格中,直到到达网格末尾。

这种方法存在两个主要问题:

  1. "效果"落下不是非常平滑,它非常不稳定,我已经能够通过向下扩展网格并减少DispatcherTimer蜱的间隔来改善运动的流动性但是它充其量是一个创可贴解决方案,我仍然可以说这个动作非常机械化。
  2. 另一个问题与第一个问题密切相关,每当这些下降表达的文本框被聚焦时,下降变得更加糟糕,它真的慢到爬行我猜测重绘每一个控件同时有焦点在文本框上严重降低了导致这种情况的性能。
  3. 无论如何因为这个,我正在寻找另一种方法来做到这一点,最好是它必须易于使用并且易于与我当前的代码集成。

2 个答案:

答案 0 :(得分:0)

您可以使用画布并在DispatcherTimer中更改其位置。

在网站上抓取示例模型,实现用于拖动对象。

void onDragDelta(object sender, DragDeltaEventArgs e)
        {
            Canvas.SetLeft(myThumb, Canvas.GetLeft(myThumb) + e.HorizontalChange);
            Canvas.SetTop(myThumb, Canvas.GetTop(myThumb) + e.VerticalChange);
        }

以下是相关问题:Here

这是主要的可拖动控制文章:Here

答案 1 :(得分:0)

我认为你应该使用" StoryBoard"和"动画"处理你的UserControl下降。 内置动画基于" Timer"系统但它已经处理了所有问题,例如"如果之前的更改尚未提交,则不要将3个更改发布到屏幕上#34;或者如果UI线程没有"则中止先前的位置呈现; t有时间开始渲染它"。

所以,我会以编程方式生成" Storyboard" s。 有用的是,每个DependencyProperty都可以动画"。

请参阅:Using a Storyboard animation on a programatically-added control

这是我的动画动画的代码,该属性具有" Double"类型:

    /// <summary>
    /// Create a linear animation
    /// </summary>
    /// <param name="duration"></param>
    public void CreateDoubleLinearAnimation(DependencyObject element, string name, string property, double? valueFrom, double valueTo, TimeSpan timeSpan, Storyboard sb)
    {

        // --- Animation toute bête
        DoubleAnimation animation = new DoubleAnimation();
        animation.Duration = new Duration(timeSpan);
        animation.To = valueTo;
        if (valueFrom != null)
            animation.From = valueFrom.Value;
        animation.SetValue(Storyboard.TargetNameProperty, name);
        animation.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(property));

        sb.Children.Add(animation);
    }

电话示例:

Storyboard sb = new Storyboard();
CreateDoubleLinearAnimation(element, "myElement", "(UIElement.Opacity)", 0, 1, TimeSpan.FromSeconds(1), sb);

&#34;属性的例子&#34;参数:

(Shape.StrokeThickness)
(UIElement.Opacity)
(UIElement.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)

致以最诚挚的问候,