C# wpf实现控件刷新的示例代码
前言
做wpf开发不像mfc控件的刷新相对同步,wpf的控件改变宽高或者可见性后在下一行代码不会立刻看到效果,而且也没有一种事件可以获取确切的界面刷新后的时机。如果只是进行延迟等待,在不同机器效果是不同的,而且也并没有具体标识说明已刷新界面,这就导致某些场景的功能实现起来会比较困难。本文提供一种获取控件真正界面刷新时机的方法。
一、为何要获取刷新时机
例子一、隐藏控件后截屏
需要隐藏控件后截屏,直接修改Visibility后截屏是不行的,控件不会立刻隐藏,所以会截到控件的画面。如果不能获取到真正的刷新时机,那就这能延时等待,但延时是不稳定的,至少笔者就遇到了延时500毫秒再截屏,依然在生产环境有客户遇到了截到控件画面的bug。
例子二、修改控件大小后做计算
有一段逻辑需要根据控件大小做计算,使用的是ActualWidth、ActualHeight。在这段逻辑前刚好有修改大小的代码,但此时修改Width、Height之后ActualWidth、ActualHeight不会立刻改变,需要等到界面刷新时会改变,这就会导致计算数值不正确。这种场景很可能难以使用延时。
二、如何实现
1.使用动画
wpf的动画有个完成事件,我们通过这个事件就可以获取绘制完一帧的时机。
//创建
var da = new DoubleAnimation(1, 0, new Duration(TimeSpan.FromMilliseconds(1)), FillBehavior.Stop);
da.Completed += (S, E) {
//动画完成,此处表明控件已刷新
};
//启动动画触发绘制
elememt.BeginAnimation(Control.OpacityProperty, da);
2.使用TaskCompletionSource
使用TaskCompletionSource是为了提供异步接口,方便使用,在使用时只需要await即可。
var tcs = new TaskCompletionSource(); da.Completed += (S, E) => tcs.SetResult(); await tcs.Task;
三、完整代码
public static class ElementExtensions
{
/// <summary>
/// 等待控件真实刷新后
/// </summary>
internal static Task WaitForPaint(this UIElement elememt)
{
var tcs = new TaskCompletionSource();
//通过动画来获取这个时机
var da = new DoubleAnimation(1, 0, new Duration(TimeSpan.FromMilliseconds(1)), FillBehavior.Stop);
da.Completed += (S, E) => tcs.SetResult();
//启动动画触发绘制
elememt.BeginAnimation(Control.OpacityProperty, da);
return tcs.Task;
}
}
四、使用示例
1、隐藏工具条截屏
private async void Button_Click(object sender, RoutedEventArgs e)
{
//隐藏工具条
toolBar.Visibility= Visibility.Collapsed;
//等待界面上真正隐藏
await toolBar.WaitForPaint();
//截屏
略
//显示工具条
toolBar.Visibility= Visibility.Visible;
}
2、修改宽高后获取ActualWidth、ActualHeight
private async void Button_Click(object sender, RoutedEventArgs e)
{
var button = sender as Button;
Console.WriteLine("ActualWidth=" + button.ActualWidth + " ActualHeight=" + button.ActualHeight);
button.Width = 100;
button.Height = 100;
Console.WriteLine("ActualWidth=" + button.ActualWidth + " ActualHeight=" + button.ActualHeight);
await button.WaitForPaint();
Console.WriteLine("ActualWidth=" + button.ActualWidth + " ActualHeight=" + button.ActualHeight);
}
效果预览

到此这篇关于C# wpf实现控件刷新的示例代码的文章就介绍到这了,更多相关C# wpf控件刷新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C#使用Datatable导入sqlserver数据库的三种方法
本文主要介绍了C#使用Datatable导入sqlserver数据库的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-08-08
C#使用BitConverter与BitArray类进行预定义基础类型转换
这篇文章介绍了C#使用BitConverter与BitArray类进行预定义基础类型转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-05-05
C#在WinForm中使用WebKit传递js对象实现与网页交互的方法
这篇文章主要介绍了C#在WinForm中使用WebKit传递js对象实现与网页交互的方法,涉及针对WebBroswer控件及WebKit控件的相关使用技巧,需要的朋友可以参考下2016-03-03


最新评论