社区
C#
帖子详情
WPF 如何避免画面闪烁
jxin114
2007-03-27 10:34:23
我在canvas上加入一个rectangle,然后开一个线程,每40毫秒,修改一下rectangle的width和height属性,每次加1,但是我发觉rectangle会闪,似乎是WPF先擦掉了这个rectangle,画了一遍背景,然后又重绘rectangle,有什么办法能不闪吗?
...全文
1444
17
打赏
收藏
WPF 如何避免画面闪烁
我在canvas上加入一个rectangle,然后开一个线程,每40毫秒,修改一下rectangle的width和height属性,每次加1,但是我发觉rectangle会闪,似乎是WPF先擦掉了这个rectangle,画了一遍背景,然后又重绘rectangle,有什么办法能不闪吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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里做动画似的。没有闪烁~
WPF
记事本开发详解/Notepad/MVVM
在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编程。
谁说
WPF
的
画面
不
闪烁
?
谁说
WPF
的
画面
不
闪烁
? 如果你对
WPF
的渲染机制不够了解,那么可能你做出来的图形绘制UI就会
闪烁
,当然也可能碰巧不会
闪烁
。从你对WriteableBitmap的了解就可以看出来你对
WPF
渲染机制的掌握程度。 详细的不说,问题的解决方法在我和
WPF
中文官方论坛的版主互相讨论的帖子里有。 请参考:http://social.msdn.micros
WPF
控件专题 MediaElement控件详解
WPF
控件专题 MediaElement控件详解
取消dataGridView加载数据
闪烁
的方法
通过实现双缓冲解决窗体、控件尺寸大小发生变化,以及DataGridView控件在加载数据时产生的
闪烁
问题 1、设置窗体和控件的双缓冲 方法一:使用窗体或控件的DoubleBuffered属性 this.DoubleBuffered = true;在这里插入代码片 方法二: //将指定的标志设置为true或false this.SetStyle(ControlStyles.OptimizedDou...
WPF
单例(instance)子窗体Hide后再次Show会闪现上一次的
画面
问题处理
单例窗口的关闭不能去杀死释放,所以一般都是重写OnClosing,在里边调用Hide()方法。 而当Hide后,虽然已经在之前清空了界面绑定等内容。但是界面并没有去重绘,使用this.InvalidateVisual()强制重新刷新也没有效果。 其实这个是需要等事件执行完后再去调用Hide(),就能够触发界面刷新。所以使用一个异步,延迟100毫秒等走完OnClosing方法再执行Hide()方法就能够刷新一次界面,在这之前设置界面绑定为空,下一次再调起单例弹窗的时候就不会有上一次的界面遗留,出现一个旧数
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章