[問題] Wpf,關於使用Invoke、及開新視窗的小問題
小弟在寫作業時遇到幾個難解的問題
第一、不同線程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
06/07 08:22, 1F
→
06/07 08:23, , 2F
06/07 08:23, 2F
→
06/07 08:23, , 3F
06/07 08:23, 3F