我正在 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 中执行此操作,因为我需要它更平滑。
最佳答案
您的“while”循环正在锁定 UI 线程并阻止出现增量更改。两种选择是 1将循环体包装到由 Dispatcher 调用的方法中(从而释放 UI 线程来更新用户界面)。
或者 [2] 动态创建一个在页边距顶部使用 DoubleAnimation 的 Storyboard。使用 [2] 需要您预先测量移动量,但如果您想在网格接近其最终目的地时添加令人印象深刻的缓动功能,那么可能是值得的。
1是最快实现的,[2] 可以实现流畅的视觉效果。 msdn docs are here
关于C# WPF 更新 GUI 并移动网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847990/