WPF 如何避免画面闪烁

jxin114 2007-03-27 10:34:23
我在canvas上加入一个rectangle,然后开一个线程,每40毫秒,修改一下rectangle的width和height属性,每次加1,但是我发觉rectangle会闪,似乎是WPF先擦掉了这个rectangle,画了一遍背景,然后又重绘rectangle,有什么办法能不闪吗?
...全文
1444 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
paual779 2011-03-03
  • 打赏
  • 举报
回复
使用故事板,这样画面变化会平滑一些,尽量不要自己使用线程直接改变元素的属性
liujianxin1221 2011-03-03
  • 打赏
  • 举报
回复
public BackgroundWorker bw = null;
public mainwindow()
{
this.InitializeComponent();
bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler( bw_DoWork );//把自己的代码放bw_DoWork函数里ok
}
private void bw_DoWork( object sender, DoWorkEventArgs e )
{
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, //这就是单独执行的,当然段这段可以放在别的函数里
new Action(delegate()
{

}
}
jxin114 2007-03-28
  • 打赏
  • 举报
回复
非常感谢namhyuk提供的跨线程修改UI的方法,但是闪烁的问题仍然存在
stswordman 2007-03-27
  • 打赏
  • 举报
回复
使用故事板,这样画面变化会平滑一些,尽量不要自己使用线程直接改变元素的属性
hawk5456 2007-03-27
  • 打赏
  • 举报
回复
不知道
Red_angelX 2007-03-27
  • 打赏
  • 举报
回复
不懂vpf 帮顶
xyq1986 2007-03-27
  • 打赏
  • 举报
回复
前几天刚了解了一下WPF,XAML,还可把环境搭上了
Xpengfee 2007-03-27
  • 打赏
  • 举报
回复
郁闷啊,看了半天都不知道嘛意思
csShooter 2007-03-27
  • 打赏
  • 举报
回复
靠,看来落后了!!
namhyuk 2007-03-27
  • 打赏
  • 举报
回复
参考:

在WPF的用户线程中更新UI界面

WPF中UI线程队列由Dispatcher来管理和调度,所以当用户线程中更新UI时,必须通过Dispatche来调度,下面这个小例子将给用户展示如何在用户线程中更新当前的时间.

前台的XAML代码如下:
<Windowx:Class="ThreadInvoke.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ThreadInvoke"Height="300"Width="300"
>
<StackPanelOrientation="Vertical">
<StackPanelOrientation="Horizontal">
<ButtonContent="Ok"Click="okClick"Width="50"/>
<ButtonContent="Stop"Click="stopClick"Width="50"/>
</StackPanel>
<TextBoxName="timeText"></TextBox>
</StackPanel>
</Window>

后台的主要代码如下:

//申明一个代理用于想UI更新时间
private delegate void DelegateSetCurrentTime();

//申明一个变量,用于停止时间的跳动
private bool stopFlag = false;

//处理开始和结束事件
private void okClick(object sender,RoutedEventArgs args)
{
stopFlag = false;
Thread thread = new Thread(new ThreadStart(refreshTime));
thread.Start();
}

private void stopClick(object sender, RoutedEventArgs args)
{
stopFlag = true;
}

//用户线程的实现函数
private void refreshTime()
{
while (!stopFlag)
{
//向UI界面更新时钟显示 Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new DelegateSetCurrentTime(setCurrentTime));
}
}

private void setCurrentTime()
{
String currentTime = System.DateTime.Now.ToString();
timeText.Text = currentTime;
}
jxin114 2007-03-27
  • 打赏
  • 举报
回复
我在线程里调用form的invoke,是form的线程修改位置的,canvas是form的子窗口
tgl10 2007-03-27
  • 打赏
  • 举报
回复
是的,别在线程里修改位置
yucong 2007-03-27
  • 打赏
  • 举报
回复
up
mmens 2007-03-27
  • 打赏
  • 举报
回复
mark
jxin114 2007-03-27
  • 打赏
  • 举报
回复
我用了Animation也闪,我在试试Storyboard吧
namhyuk 2007-03-27
  • 打赏
  • 举报
回复
同意ls

用Storyboard

在Expression Blend,画一矩型,按F7,进入Animation Workspace.
增加一个Event,增加一个Action, 在时间线开始处增加一个关键帧,在时间线适当地方按住Shift键放大矩型。OK,that's all.

有点像Flash里做动画似的。没有闪烁~
在Windows系统中,notepad.exe(记事本)是一个“经典的”、“简洁的”文本编辑器。这个软件,没有华丽的外观,也没有繁杂的功能,仅仅是一个文本编辑小软件。虽然经过Windows系统数十年的变换,但它却保持着永恒姿态,数十年来几乎不曾改变过。曾经,VS中的经典DEMO中,就有它的身影,一个新建的项目,就藏有一个新建的“记事本”。然而,在WPF的项目中,“记事本”却消失的无影无踪,也许是很容易实现,也许是为了革新,而不愿再传承“经典”。确实,使用WPF技术再次让“记事本”复活,确实也是一件非常容易的事情。但是,如果,使用WPF技术,再搭配当下非常流行的MVVM模式呢?复活“记事本”的难度却陡然上升至很多WPF程序员为之默默叹气。而,MVVM模式是掌握WPF的最顶级技术,MVVM模式拥有的无尽的优势,让WPF相对于过往的编程模式来说,是一种革命性的创新,从而也成为大中型WPF项目中必须的模式。但,学习难度。。。。。。在这个《WPF记事本开发详解》的课程中,赵老师带领你在WPF中,从零开始一步步构建MVVM模式,直到让你亲自以WPF+MVVM的方式,让这个经典的“记事本”软件从你的手中“复活”。在课程中,赵老师会详细讲解WPF和MVVM中的各种技巧,让你从此爱上WPF+MVVM编程。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧