wpf中 我新開乙個執行緒新增控制項到主窗體

2023-09-17 21:24:06 字數 3480 閱讀 2482

1樓:塗海凡

窗體的控制項是在主執行緒中的,也就是你一開始執行程式那個。wpf和其他。net規則裡不允許跨執行緒呼叫,這被認為是不完全的。

一種是直接忽略所有的此類警告, =false;好像是這麼寫的,就是忽略所有的因跨執行緒產生的不安全警告。不過此方法不推薦。

第二種就是使用委託,具體例子有很多。

第三種是用winform的backgroundworker,不過wpf裡把這個去掉了。加上的話雖然可以用,但是就會讓wpf顯得不倫不類。

總之推薦第二種。

2樓:網友

執行緒中可以直接這樣操作ui的?不需要用委託嗎?

c#如何在子執行緒中建立窗體並使用?

3樓:手機使用者

確定使用非同步?非同步的時候多執行緒是通過系統來負責執行緒的建立和執行的,不需要你操作的。

猜測你弄錯了非同步的用法。

那個窗體處於忙狀態,很簡單,是因為建立它的執行緒沒有空餘時間(比如一直處於忙或迴圈中),所以它沒法響應訊息。

通常來說,你的做法是不可取的。因為乙個執行緒執行完畢,它就會結束,它很少處在乙個空閒狀態來讓視窗更新狀態訊息。建立窗體,建議盡量在主執行緒中建立。

wpf 怎麼呼叫子執行緒視窗的方法?

4樓:

建議你到這裡提問。

c# 子執行緒訪問主窗體控制項

5樓:網友

是的,在其他執行緒裡,不允許呼叫主執行緒建立的控制項~!!

這樣做,是不安全的,因此,遮蔽了這個~

樓上說的很對,用委託,具體**如下~:

public delegate void myinvoke(string str);

private void button9_click(object sender, eventargs e)

private void fun()

private void settext(string s));else}

6樓:網友

在form宣告中加上 = false;

可以忽略控制項得執行緒交叉引用錯誤。

修改後如下:

public form1()

7樓:網友

.net 原則上禁止跨執行緒訪問控制項,因為這樣可能造成錯誤的發生,推薦的解決方法是採用**,用**方法來間接操作不是同一執行緒建立的控制項。

第二種方法是禁止編譯器對跨執行緒訪問作檢查,可以實現訪問,但是出不出錯不敢保證 = false;

8樓:網友

整乙個全域性的變數用用。

c# 在某個執行緒上建立的控制項不能成為在另乙個執行緒上建立的控制項的父級

9樓:非我即仙

哈哈,這個問題我也碰到過的!

msdn上的解釋說。前的時代可以通過子執行緒在父執行緒建立控制項,當時你上述的**是正確的。

但是使用執行緒操作常常會是複雜而且危險的,所以微軟在。及以後版本都對執行緒的操作進行了限制。

像你的**流程應該是這樣的:

首先在form1的窗體載入中新建了乙個class1物件並將本身的引用傳遞進入其建構函式,然後在class1的建構函式中建立乙個執行緒。該執行緒所**的方法事件是本類中的乙個add方法。而add方法的內容則是在form1上放乙個textbox.

然而這個流程你需要注意的有幾個問題:

1.哪個是主執行緒?所謂主執行緒是第乙個啟動的執行緒,是從main開始的。form1的這個窗體是由主執行緒建立的。

t的執行緒是什麼?t是由主執行緒建立的,t的操作內容是在由主執行緒建立的窗體上放乙個textbox.

也就是說,t的操作是跨執行緒的窗體操作。雖然樓主把checkforillegalcrossthreadcalls 設定成了false,但是還存在在某個執行緒上建立的控制項不能成為在另乙個執行緒上建立的控制項的父級這個異常。

這個問題說實話我也不懂,不好說什麼。可能微軟禁止了乙個執行緒在另乙個執行緒上新增自己的控制項,因為這種做法著實不安全。

至於解決辦法:

1.不要執行緒,只在乙個主執行緒中操作。此時你在class1中新增控制項也好,在form1中寫個方法來新增控制項也好,都是可行的。

2.通過**來實現。在對form1物件的操作中。

if(else

**。class class1

public void add()

else}}

樓主可以在msdn上查詢 「執行緒處理[windows窗體]」,上面有很詳細的描述。

在下也是菜鳥乙隻,有錯誤請樓下的朋友指出。

10樓:網友

每個控制項都有自己的所屬執行緒,ms基於安全考慮。不允許跨執行緒訪問控制項。

所以這個地方要使用委託來切換到主執行緒來建立並增加控制項。

control類有個invokerequire來判斷是否需要切換執行緒用委託完成:

public delegate void deal();

private deal deal = new deal();

在form_load()裡面加上。

deal+= takepicturefunction;

執行緒函式中}

11樓:網友

我不明白,樓主搞這麼複雜為了什麼。

你們都學得很高深。

你不如說個意圖來聽聽,有沒有更簡單的方法。

wpf的使用者控制項怎麼訪問主窗體的控制項

12樓:春天的歪樹

我有乙個使用者控制項,使用者控制項被動態載入到主窗體(frm_manage)裡。我想當使用者控制項被點選後就清空主窗體裡grid控制項裡的所有子控制項。

private void lbl_menuname_mouseleftbuttondown(object sender, mousebuttoneventargs e)上面這樣寫的話會報錯:frm為null。

--解決方案---使用事件。

主視窗響應事件,把值傳給控制項。

--解決方案---呃,你把usercontrol放mainwindow裡不就結了。

wpf的話更建議用資料驅動的思想設計程式。

--解決方案---響應事件的方法比較簡單。

使用者控制項定義好了,在主窗體裡完全可以把使用者控制項當作乙個按鈕來用。

#使用者控制項// 定義public event eventhandler click;

被點選時,傳遞點選事件給外部。

if (null !=click) click(null, null);/#主窗體// 使用者控制項的點選事件。

(us, ue) =

--解決方案---實在不行你就給usercontrol寫個setparent的方法 初始化的時候呼叫下 把父視窗傳遞進去 然後用就是了這樣基本上可以解決你的問題 但是不是推薦的做法。

13樓:匿名使用者

在winform裡用parentform很簡單就能實現。

簡單控制元件涉及了執行緒知識,一個簡單控制元件涉及了執行緒知識

用backgroundworker吧,上msdn看看。c 程式載入過程中顯示載入等待介面怎麼做 用程序去載和資料 在程序中更新載入的實時狀態 panel.enable有沒有設為true啊 如何實時更新ui,datagridview 跨執行緒訪問控制元件 看設計介面 資料庫用到的是sqlite 英文s...

本人最近想開一家化妝品店,我想開一個化妝品店,需要什麼手續?

6月29日 08 54 化妝品有高 中 低三檔產品,像蘭寇 資生堂 高絲 cd 香奈兒等等國際名牌被稱為一線品牌 玉蘭油 歐萊雅等由合資公司生產 適中的產品屬二線品牌 大寶 小 等 較為低廉的化妝品就屬三線品牌了。這三檔化妝品分別通過大型百貨商店 專賣店 超市或街頭小店三種渠道銷售。在日本 韓國,國...

我想自己開個小店做什麼好呢我想自己開一個小店,賣什麼好?

首先看看你投資的是資本有哪些,時間,精力,金錢都算 其次需要看看你期待的收益,比如混個穩定生活 再次,其實是最重要的,這份投入,需要考慮你可否積累下可以持續發展的資源 這點很重要,表明你做了這件事以後的格局,比如開個小店以後你可以收穫人脈。1 首先你要有充足的資金,在你進貨時要找準市場,在進行投資之...