[問題] Wpf,關於使用Invoke、及開新視窗的小問題

看板C_Sharp作者 (藍調迷思)時間11年前 (2013/06/06 17:58), 編輯推噓0(003)
留言3則, 1人參與, 最新討論串1/1
小弟在寫作業時遇到幾個難解的問題 第一、不同線程Invoke的使用 程式為一個win7放大鏡的例子 一樣是使用Wpf的例子作修改,遇到跟這位同學一樣的問題 http://ppt.cc/wJj- 要做的是,利用截取螢幕畫面放大的方法,製作Win7放大鏡(透鏡)的效果 但由於截圖的動作是一直在更新,所以導致會截取到程式本身,造成放大過的畫面 又在被放大,最後就是無限迴圈越放越大。 我的做法是使用System.Windows.Threading.DispatcherTimer建構一個timer物件定時 作更新畫面的動作。 而在截取畫面之前先把程式主體透明化,這樣抓螢幕畫面的時候 就不會連同程式主體一起抓進去,等抓完再把程式顯現。 程式會不斷的呼叫 void timer_Tick(object sender, EventArgs e) 做更新 由於GUI要等 timer_Tick 函式結束後才會做更新, 所以假如我直接寫 void timer_Tick(object sender, EventArgs e) { image1.Opacity = 0; //程式透明化 //中間截取螢幕畫面 image1.Opacity = 1; //顯示程式 } 這樣會造成最一開始的程式透明化步驟無效,因為timer_Tick還沒跑完所以程式不會透 明化。 因此我網路上查了資料,使用Thead和Invoke來做,更改後程式碼如下 完整 http://ppt.cc/fBO1 部分程式碼 public delegate void UpdateImageCallback(); void UpdateUi() { image1.Dispatcher.Invoke(new UpdateImageCallback(UpdataImage)); } void UpdataImage() { image1.Opacity = 0; } void timer_Tick(object sender, EventArgs e) { updateUi = new Thread(new ThreadStart(UpdateUi)); updateUi.Start(); //中間做截取螢幕畫面! image1.Source = bitmapSource; image1.Opacity = 1; } 我在timer_Tick裡面加了新的Thread讓GUI立即做更新。 由於新Thread是獨立的新線程,所以要用Invoke抓取GUI的物件。 執行的結果是Thread依然沒有如我想像的即時執行,而是等timer_Tick結束後才執行 void UpdataImage() 這個函式。 這是第一個問題 第二個問題 關於Wpf中資料的傳遞 我在Wpf主視窗MainWindow建立了一個新的視窗Window1 (非執行階段) 然後用傳入this的方式建構Window1物件 結果是無法互相取得兩個視窗間的項目 程式碼 http://ppt.cc/nmx_ 請問我該如何在視窗間取得彼此的資料呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 134.208.3.115 ※ 編輯: moonskyex 來自: 134.208.3.115 (06/06 18:25)

06/07 08:22, , 1F
問題2 應可在兩視窗程式 宣告public的function
06/07 08:22, 1F

06/07 08:23, , 2F
透過function來回傳彼此的值 若是偷懶一點可以宣告
06/07 08:23, 2F

06/07 08:23, , 3F
全域變數就是了 以上淺見
06/07 08:23, 3F
文章代碼(AID): #1Hi5rX9a (C_Sharp)