C# wpf实现控件刷新的示例代码

 更新时间:2024年01月17日 08:50:59   作者:CodeOfCC  
这篇文章主要为大家详细介绍了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#中使用OpenCV(GOCW使用教程)

    如何在C#中使用OpenCV(GOCW使用教程)

    这篇文章主要介绍了如何在C#中使用OpenCV(GOCW使用教程),帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • 详解c# 类型转换

    详解c# 类型转换

    这篇文章主要介绍了c# 类型转换的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以学习
    2020-07-07
  • C#实现异步连接Sql Server数据库的方法

    C#实现异步连接Sql Server数据库的方法

    这篇文章主要介绍了C#实现异步连接Sql Server数据库的方法,涉及C#中await方法的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# 屏蔽关键字的实现方法

    C# 屏蔽关键字的实现方法

    前段时间在公司做了一个论坛屏蔽关键字的功能,我做的比较简单、实用~ 现在拿出来给博友们分享下..也希望大家能顶顶我~
    2013-05-05
  • Unity使用LineRender断笔写字

    Unity使用LineRender断笔写字

    这篇文章主要为大家详细介绍了Unity使用LineRender断笔写字效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • C#实现单件模式的三种常用方法

    C#实现单件模式的三种常用方法

    这篇文章主要介绍了C#实现单件模式的三种常用方法,分析了单件模式的原理、功能与常用的三种实现方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# 组件的使用方法示例详解

    C# 组件的使用方法示例详解

    这篇文章主要介绍了C# 组件的使用方法示例详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • 深入解析C#中的交错数组与隐式类型的数组

    深入解析C#中的交错数组与隐式类型的数组

    这篇文章主要介绍了深入解析C#中的交错数组与隐式类型的数组,隐式类型的数组通常与匿名类型以及对象初始值设定项和集合初始值设定项一起使用,需要的朋友可以参考下
    2016-01-01
  • C#中overrid和new修饰符有什么不同

    C#中overrid和new修饰符有什么不同

    在C#的继承中尝尝会用到相关的修饰词:override和new。这两个修饰符都可以在新的子类中,重写同名的父类方法。下面通过本文给大家介绍C#中overrid和new修饰符的区别,感兴趣的朋友一起看看吧
    2018-02-02
  • Unity实现通用的信息提示框

    Unity实现通用的信息提示框

    这篇文章主要为大家详细介绍了Unity实现通用的信息提示框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06

最新评论