WPF 利用子線程彈出子窗體的研究

2021-09-08 05:05:29 字數 3605 閱讀 1730

原文:

wpf 利用子線程彈出子窗體的研究

一般來說子執行緒都是用來處理資料的,主窗體用來實現展現,但是有些時候我們希望子窗體實現等待效果,遮擋主窗體並使主窗體邏輯正常進行,這個業務需求雖然不多,但是正好我們用到了,於是我打算把研究成果寫在這了。稍後我會上傳我的**,包含測試程式以及之前兩邊博文談到的控制項,這裡我還實現了乙個類似雷達掃瞄的等待窗體,大家可以稍後檢視。

實際上這裡只有兩個難點需要處理,乙個就是如何讓子窗體遮擋主窗體並位於主窗體中間,另乙個就是委託及跨執行緒訪問ui介面。為了方便呼叫,我在這裡寫了乙個靜態的子執行緒窗體管理類dialogwindowsmanager。

1.遮擋主窗體

大家都知道,showdialog方法就是最好的遮擋效果,但是由於它是執行緒阻塞的,因此每當我們想到這裡的時候會有乙個誤區,認為呼叫showdialog一定會阻塞前台介面,其實這裡的阻塞只是阻塞呼叫方法所在的執行緒,並不是一定會阻塞主線程,因此在子執行緒中呼叫showdialog方法即可達到效果。實際測試時發現遮擋效果確實有了,可惜每次showdialog的時候窗體會滿螢幕亂飛,好吧,最好的方法當然是設定onwer,不過我一直沒嘗試成功,因為主窗體與子窗體一直處於兩個執行緒中,最後我通過乙個演算法將位置計算出來之後賦值給了子窗體。**如下:

1

///2

///開啟等待窗體執行緒

3///

4public

static

void

showwaitingform(window onwer)

14else

18 }

view code

2.跨執行緒訪問

這裡不得不說wpf還是很給力的,因為它提供了dispatcher來獲取當前要更新的執行緒,這裡網上資料很多,我就不多做解釋了,直接上**:

1

///2

///設定進度條百分比

3///

4///

百分比5

public

static

void setprogrssformpercent(double

d) }));

8 thread.sleep(50);9

}10 }

view code

3.注意事項

子執行緒也是ui執行緒,因此執行緒一定要設定為apartmentstate.sta狀態。

完成的執行緒管理**如下:

1

using

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 }

view code

整個解決方案我會上傳的!!

WPF 利用子線程彈出子窗體的研究

原文 wpf 利用子線程彈出子窗體的研究 一般來說子執行緒都是用來處理資料的,主窗體用來實現展現,但是有些時候我們希望子窗體實現等待效果,遮擋主窗體並使主窗體邏輯正常進行,這個業務需求雖然不多,但是正好我們用到了,於是我打算把研究成果寫在這了。稍後我會上傳我的 包含測試程式以及之前兩邊博文談到的控制...

子窗體彈出位置錯誤

在設計窗體時通常會把子窗體的 position 設定成 pomainformcenter。也就是說,子窗體彈出的位置是主窗體的正中。但是如果把主窗體拖動到螢幕左下角,而且主窗體的50 部分已經超出了螢幕範圍,這個時候主窗體的正中其實已經不在螢幕範圍之內了。這個時候彈出的子窗體可能部分或者完全處在螢幕...

WPF獲取子 父窗體控制項

獲得父窗體控制項 要獲得控制項類名 當前子控制項名 要查詢父控制項名 要獲得控制項類名 public static t getparentobject dependencyobject obj,string name where t frameworkelement parent visualtre...