【问题标题】:C# WPF update GUI and move gridC# WPF 更新 GUI 和移动网格
【发布时间】: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


【解决方案1】:

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

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

1 是最快实现的,[2] 可以实现流畅的视觉效果。 msdn docs are here

【讨论】:

  • 我不明白你的意思。能给我提供代码示例吗?
  • @BOSS 如果 Storyboards 的概念是新的,您可以先查看概述以了解概念。一旦你掌握了 WPF 如何使用它们的理论,它们就非常简单了。但是,如果您想直接跳到代码,MSDN 上有一个很好的示例。 msdn.microsoft.com/en-us/library/ms754066.aspx 他们正在以您需要的方式为属性设置动画。在示例中,它是 width 属性,在您的情况下,它是 margin top 属性。您需要大约 8 或 9 行代码...
  • 哇,太棒了,我要去看看并弄清楚。非常感谢提供这么棒的资源。
  • @BOSS,一路上有任何问题,只要打开一个关于 WPF Storyboards 的问题。他们很有趣!
猜你喜欢
  • 2013-06-10
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多