日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WPF Dispatcher在界面操作中作用體現(xiàn)

對于一個開發(fā)人員來說,可能在開發(fā)一個程序的時候?qū)D形界面的要求并不是很高,因為他們不是美工。那么,使用了WPF后,開發(fā)人員可以輕松的實現(xiàn)精美的圖形界面。#t#

十多年的范縣網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整范縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“范縣網(wǎng)站設(shè)計”,“范縣網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

使用一個專用的 UI 線程來完成界面的操作和更新,這個線程會關(guān)聯(lián)一個***的WPF Dispatcher 對象,用于調(diào)度按優(yōu)先順序排列的工作項隊列。Application.Run() 實際上就是對 Dispatcher.Run() 的間接調(diào)用。

WPF Dispatcher通過循環(huán)來處理工作項隊列,這個循環(huán)通常被成為 "幀 (DispatcherFrame)"。Dispatcher.Run() 創(chuàng)建并啟動這個幀,這也是 Application.Run() 啟動消息循環(huán)的最終途徑。

 
 
 
  1. public sealed class Dispatcher  
  2. {  
  3. [SecurityCritical, 
    UIPermission(SecurityAction.
    LinkDemand, Unrestricted=true)]  
  4. public static void Run()  
  5. {  
  6. PushFrame(new DispatcherFrame());  
  7. }  

DispatcherFrame 可以嵌套,并通過檢查 Continue 屬性來決定循環(huán)是否繼續(xù)。我們可以通過調(diào)用 Dispatcher.ExitAllFrames() 來終止所有的幀循環(huán),當(dāng)然這種編程方式并不可取,可能會造成一些意外出現(xiàn)。

與WPF Dispatcher調(diào)度對象想對應(yīng)的就是 DispatcherObject,在 WPF 中絕大部分控件都繼承自 DispatcherObject,甚至包括 Application。這些繼承自 DispatcherObject 的對象具有線程關(guān)聯(lián)特征,也就意味著只有創(chuàng)建這些對象實例,且包含了 Dispatcher 的線程(通常指默認(rèn) UI 線程)才能直接對其進(jìn)行更新操作。

當(dāng)我們嘗試從一個非 UI 線程更新一個標(biāo)簽,會看到一個如下的異常。

 
 
 
  1. private void button1_Click
    (object sender, RoutedEventArgs e)  
  2. {  
  3. new Thread(() => this.label1.
    Content = DateTime.Now.
    ToString()).Start();  

按照 DispatcherObject 的限制原則,我們改用 Window.Dispatcher.Invoke() 即可順利完成這個更新操作。

 
 
 
  1. private void button1_Click
    (object sender, Routed
    EventArgs e)  
  2. {  
  3. new Thread(() => 
  4. {  
  5. this.Dispatcher.Invoke
    (DispatcherPriority.Normal,  
  6. new Action(() => this.
    label1.Content = DateTime.
    Now.ToString()));  
  7. }).Start();  

如果在其他項目(比如類庫)中,我們可以用 Application.Current.Dispatcher.Invoke(...) 完成同樣的操作,它們都指向 UI Thread Dispatcher 這個***對象。

WPF Dispatcher還提供了 BeginInvoke 這個異步版本。

 
 
 
  1. private void button1_Click(object 
    sender, RoutedEventArgs e)  
  2. {  
  3. new Thread(() => 
  4. {  
  5. Application.Current.Dispatcher.
    BeginInvoke(DispatcherPriority.Normal,  
  6. new Action(() => 
  7. {  
  8. Thread.Sleep(3000);  
  9. this.label1.Content = 
    DateTime.Now.ToString();  
  10. }));  
  11. MessageBox.Show("Hi!");  
  12. }).Start();  

凡事都有例外,WPF 還提供了一種繼承自 Freezable 的類型,盡管 Freezable 也間接繼承自 DispatcherObject,但當(dāng)諸如WPF Dispatcher這類對象從修改狀態(tài)變成凍結(jié)狀態(tài)時,它即變成自由線程對象,不在具有線程關(guān)聯(lián)。


當(dāng)前文章:WPF Dispatcher在界面操作中作用體現(xiàn)
本文鏈接:http://m.5511xx.com/article/djppgpd.html