我在WPF做了一个小小的数学游戏,我有一些"下降的文本块"包含在您到达窗口底部之前必须正确回答的乘法。
目前它看起来像这样
我现在正在做的是每个文本块都是一个自定义WPF控件,它包含一个表示表达式的文本块和一个文本框,用户可以在其中输入该表达式的答案。这些是在40x20网格内部生成的,我使用DispatcherTimer
将它们连续移动到网格中,直到到达网格末尾。
这种方法存在两个主要问题:
DispatcherTimer
蜱的间隔来改善运动的流动性但是它充其量是一个创可贴解决方案,我仍然可以说这个动作非常机械化。无论如何因为这个,我正在寻找另一种方法来做到这一点,最好是它必须易于使用并且易于与我当前的代码集成。
答案 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)
致以最诚挚的问候,