2014-09-29 21 views
0

在顯示忙狀態光標時似乎有很多資源。如何爲慢速WPF控件設置忙狀態光標

但我設法找到的所有解決方案都依賴於通過視圖模型設置光標。 (即IsBusy屬性,一次性WaitCursor)。

當我知道我的數據綁定/視圖模型將長時間運行時,這些方法可以很好地工作。

但我不知道如何自動執行此操作的瓶頸是實際的WPF用戶控制本身的情況?

例如:

加載控件最初是無滯後的。但是一旦使用第三方控制,控制器每次加載時都會出現500毫秒的延遲。

綁定本身很快,因此,在視圖模型中添加一個waitcursor/IsBusy是無用的,因爲它不知道控件(或其任何邏輯/可視子項)何時完成了呈現。它也不應該知道,因爲視圖模型不應該受到視圖實現的影響。

當一個或多個WPF控件忙/慢時,應用程序是否可以自動將光標設置爲繁忙狀態?

回答

0

您可能需要這樣的事情,

  var busytimer = new DispatcherTimer(
      TimeSpan.FromSeconds(1), 
      DispatcherPriority.Normal, 
      delegate 
      { 
       Process application = null; 
       foreach (var process in Process.GetProcesses()) 
       { 
        if (process.ProcessName == "Your process name") 
        { 
         application = process; 
         break; 
        } 
       } 

       if (!application.Responding) 
       { 
        this.Cursor = Cursors.Wait; 
       } 
       else 
       { 
        this.Cursor = Cursors.Arrow; 
       } 
      }, 
      Application.Current.Dispatcher); 
0

是否有可能在一個或多個控制WPF應用程序將光標自動設置爲忙碌忙/慢?

不是。如果你的UI線程被阻塞了,你將無法更新遊標,直到遊標變得暢通無阻,這樣做會破壞目的。

結合本身是快速的,因此,在視圖模型添加waitcursor/IsBusy是無用的,因爲當控制(或任何其邏輯/視覺兒童)完成渲染它不會知道。它也不應該知道,因爲視圖模型不應該受到視圖實現的影響。

如果用IDisposable等待光標方案,就可以嘗試調度Dispose()呼叫下一個佈局後發生經過:

Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.Loaded, 
    new Action(() => waitCursor.Dispose()));