原文:
wpf 利用子線程彈出子窗體的研究
一般來說子執行緒都是用來處理資料的,主窗體用來實現展現,但是有些時候我們希望子窗體實現等待效果,遮擋主窗體並使主窗體邏輯正常進行,這個業務需求雖然不多,但是正好我們用到了,於是我打算把研究成果寫在這了。稍後我會上傳我的**,包含測試程式以及之前兩邊博文談到的控制項,這裡我還實現了乙個類似雷達掃瞄的等待窗體,大家可以稍後檢視。
實際上這裡只有兩個難點需要處理,乙個就是如何讓子窗體遮擋主窗體並位於主窗體中間,另乙個就是委託及跨執行緒訪問ui介面。為了方便呼叫,我在這裡寫了乙個靜態的子執行緒窗體管理類dialogwindowsmanager。
1.遮擋主窗體
大家都知道,showdialog方法就是最好的遮擋效果,但是由於它是執行緒阻塞的,因此每當我們想到這裡的時候會有乙個誤區,認為呼叫showdialog一定會阻塞前台介面,其實這裡的阻塞只是阻塞呼叫方法所在的執行緒,並不是一定會阻塞主線程,因此在子執行緒中呼叫showdialog方法即可達到效果。實際測試時發現遮擋效果確實有了,可惜每次showdialog的時候窗體會滿螢幕亂飛,好吧,最好的方法當然是設定onwer,不過我一直沒嘗試成功,因為主窗體與子窗體一直處於兩個執行緒中,最後我通過乙個演算法將位置計算出來之後賦值給了子窗體。**如下:
1view code///2
///開啟等待窗體執行緒
3///
4public
static
void
showwaitingform(window onwer)
14else
18 }
2.跨執行緒訪問
這裡不得不說wpf還是很給力的,因為它提供了dispatcher來獲取當前要更新的執行緒,這裡網上資料很多,我就不多做解釋了,直接上**:
1view code///2
///設定進度條百分比
3///
4///
百分比5
public
static
void setprogrssformpercent(double
d) }));
8 thread.sleep(50);9
}10 }
3.注意事項
子執行緒也是ui執行緒,因此執行緒一定要設定為apartmentstate.sta狀態。
完成的執行緒管理**如下:
1view codeusing
system;
2using
system.collections.generic;
3using
system.linq;
4using
system.text;
5using
system.threading;
6using
system.windows;78
namespace
myusercontrollibrary952
53///
54///
開啟進度條窗體方法
55///
56///
顯示位置集合 double 0-top 1-left
57private
static
void showcircleprogressform(object
o)58
6667
///68
///開啟進度條窗體方法
69///
70///
顯示位置集合 double 0-top 1-left
71private
static
void showwaitingandprogressform(object
o)72
8283
#endregion
8485
#region 公有方法
8687
///88
///開啟等待窗體執行緒
89///
90public
static
void
showwaitingform(window onwer)
100else
104}
105106
///107
///關閉等待窗體執行緒
108///
109public
static
void
closewaitingform()
110116
117///
118///
開啟進度條窗體執行緒
119///
120public
static
void
showcircleprogressform(window onwer)
121132
else
133137
}138
139///
140///
設定進度條百分比
141///
142///
百分比143
public
static
void setprogrssformpercent(double
d) }));
146 thread.sleep(50
);147
}148
}149
150///
151///
關閉進度條窗體執行緒
152///
153public
static
void
closecircleprogressform()
154161
162///
163///
開啟等待進度條窗體執行緒
164///
165public
static
void
showwaitingandprogressform(window onwer,waitandprogresstype t)
166180
else
181185
}186
187///
188///
設定進度條百分比
189///
190///
百分比191
public
static
void setwaitingandprogressformpercent(double
d)192
}));
196 thread.sleep(50
);197
}198
}199
200///
201///
關閉等待進度條窗體執行緒
202///
203public
static
void
closewaitingandprogressform()
204211
212#endregion
213}
214 }
整個解決方案我會上傳的!!
WPF 利用子線程彈出子窗體的研究
原文 wpf 利用子線程彈出子窗體的研究 一般來說子執行緒都是用來處理資料的,主窗體用來實現展現,但是有些時候我們希望子窗體實現等待效果,遮擋主窗體並使主窗體邏輯正常進行,這個業務需求雖然不多,但是正好我們用到了,於是我打算把研究成果寫在這了。稍後我會上傳我的 包含測試程式以及之前兩邊博文談到的控制...
子窗體彈出位置錯誤
在設計窗體時通常會把子窗體的 position 設定成 pomainformcenter。也就是說,子窗體彈出的位置是主窗體的正中。但是如果把主窗體拖動到螢幕左下角,而且主窗體的50 部分已經超出了螢幕範圍,這個時候主窗體的正中其實已經不在螢幕範圍之內了。這個時候彈出的子窗體可能部分或者完全處在螢幕...
WPF獲取子 父窗體控制項
獲得父窗體控制項 要獲得控制項類名 當前子控制項名 要查詢父控制項名 要獲得控制項類名 public static t getparentobject dependencyobject obj,string name where t frameworkelement parent visualtre...