2

我正在 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 中这样做,因为我需要它更流畅。

4

1 回答 1

2

您的“while”循环正在锁定 UI 线程并防止出现增量更改。两种选择:1将循环体包装到由 Dispatcher 调用的方法中(从而释放 UI 线程以更新用户界面)。

或者 [2] 动态创建一个在页边距顶部使用 DoubleAnimation 的情节提要。使用 [2] 将需要您预先测量移动量,但如果您想在网格接近其最终目的地时添加令人印象深刻的缓动功能,这可能是值得的。

1是最快的实现,[2] 允许光滑的视觉效果。 msdn 文档在这里

于 2013-05-31T00:45:49.070 回答