【发布时间】:2013-05-26 17:25:57
【问题描述】:
我正在 WPF 中创建一个以编程方式更改网格位置的简单应用程序。
主要目的是点击一个按钮,网格将开始向左、向右、向上、向下等移动。
所以我写了这段代码:
Grid G = new Grid();
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
Thread tt = new Thread(() =>
{
Dispatcher.Invoke((MethodInvoker)delegate { RUN(); });
}); tt.Start();
}
private void RUN()
{
G.Margin = new Thickness(0, MAIN_GRID.ActualHeight, 0, 0);
G.Visibility = System.Windows.Visibility.Visible;
G.Background = System.Windows.Media.Brushes.Black;
MAIN_GRID.Children.Add(G);
while (G.Margin.Top > 0)
{
G.Margin = new Thickness(0, G.Margin.Top - 1, 0, 0);
MAIN_GRID.InvalidateVisual(); // tried refreshing the GUI but no good...
Thread.Sleep(10);
}
}
发生的情况是它完全符合我的需要,但没有向我显示动画。
例如,我的代码应该将网格向上移动 1 个像素,然后休眠 10 毫秒,这足以看到网格实际移动了。
但它会冻结,一旦完成,它会显示网格的最终位置。
我在仅使用线程的 Windows 应用程序中做到了这一点,并且效果很好。但我需要在 WPF 中这样做,因为我需要它更流畅。
【问题讨论】:
-
@GrantWinney 我实际上是在 Windows 窗体中使用线程。
-
@GrantWinney 非常感谢,我修复了它,我所要做的就是将新位置放在一个单独的函数上,该函数每次都会被调用,而不是只调用一次。
标签: c# wpf user-interface invoke dispatcher