作者moonskyex (蓝调迷思)
看板C_Sharp
标题[问题] Wpf,关於使用Invoke、及开新视窗的小问题
时间Thu Jun 6 17:58:54 2013
小弟在写作业时遇到几个难解的问题
第一、不同线程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)
1F:→ winder611:问题2 应可在两视窗程式 宣告public的function 06/07 08:22
2F:→ winder611:透过function来回传彼此的值 若是偷懒一点可以宣告 06/07 08:23
3F:→ winder611:全域变数就是了 以上浅见 06/07 08:23