C# wpf 获取控件刷新的时机

文章目录

  • 前言
  • 一、为何要获取刷新时机?
    • 例子一、隐藏控件后截屏
    • 例子二、修改控件大小后做计算
  • 二、如何实现?
    • 1.使用动画
    • 2.使用TaskCompletionSource
  • 三、完整代码
  • 四、使用示例
    • 1、隐藏工具条截屏
    • 2、修改宽高后获取ActualWidth、ActualHeight
  • 总结


前言

做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);
}

效果预览
在这里插入图片描述


总结

以上就是今天要讲的内容,本文的做法是笔者曾经在某个论坛看到的建议,然后去尝试实现发现是可行的,后来进一步封装为异步方法。发出来的主要目的是作为记录,一方面是方便以后拷贝使用,另一方面也希望能对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

export CUDA_HOME=/usr/local/cuda-11.8

echo $CUDA_HOM export CUDA_HOME/usr/local/cuda-11.8

MATLAB二维与三维绘图实验

本文MATLAB源码&#xff0c;下载后直接打开运行即可[点击跳转下载]-附实验报告https://download.csdn.net/download/Coin_Collecter/88740747 一、实验目的 掌握图形对象属性的基本操作。掌握利用图形对象进行绘图操作的方法。 二、实验内容 利用图形对象绘制曲线&#xff…

如何使用服务器?

文章目录 如何使用服务器&#xff1f;一、工具二、第一种方法三、第二种方法四、实例 个人经验 如何使用服务器&#xff1f; 本文详细介绍了如何利用服务器跑模型&#xff0c;具体流程如下&#xff1a; 一、工具 ToDeskPyCharm Professional移动硬盘JetBrains GatewayGit 二…

什么是用户态和内核态?用户态和内核态是如何切换的?

一、什么是用户态和内核态&#xff1f; 1.1、概述 用户态和内核态是操作系统的两种运行状态。 内核态&#xff1a;处于内核态的 CPU 可以访问任意的数据&#xff0c;包括外围设备&#xff0c;比如网卡、硬盘等&#xff0c;处于内核态的 CPU 可以从一个程序切换到另外一个程序…

【Rust学习】安装Rust环境

本笔记为了记录学习Rust过程&#xff0c;内容如有错误请大佬指教 使用IDE&#xff1a;vs code 参考教程&#xff1a;菜鸟教程链接: 菜鸟教程链接: Rust学习 Rust入门安装Rust编译环境Rust 编译工具 构建Rust 工程目录 Rust入门 安装Rust编译环境 因为我已经安装过VSCode了&am…

数据结构中的一棵树

一、树是什么&#xff1f; 有根有枝叶便是树&#xff01;根只有一个&#xff0c;枝叶可以有&#xff0c;也可以没有&#xff0c;可以有一个&#xff0c;也可以有很多。 就像这样&#xff1a; 嗯&#xff0c;应该是这样&#xff1a; 二、一些概念 1、高度 树有多高&#x…

正点原子imx6ull网络环境配置:开发板和电脑通过网线直连、电脑WiFi上网

1.硬件连接 开发板通过网线连接电脑。电脑连接wifi 2.VMware设置 2.1添加桥接模式和NAT模式 1&#xff09;打开vm设置 2&#xff09;设置网络适配器为桥接模式&#xff0c;不要勾选 “赋值物理网络连接状态” 3&#xff09; 添加一个网络适配器并设置成NAT模式&#xff0c;…

力扣hot100 颜色分类 双指针 滚动赋值

Problem: 75. 颜色分类 文章目录 思路解题方法复杂度Code&#x1f496; 超简洁版 思路 解题方法 描述你的解题方法 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution { public void sortColors(int[] nums){int n nums.length…

QGroundControl Qt安卓环境搭建及编译出现的问题

记录Qt 5.15.2搭建安卓环境出现的各种问题。 zipalign tool not found: D:/JavaAndroid/Android/sdk/build-tools//zipalign.exe&#xff1f; 答&#xff1a;需要将DANDROID_PLATFORM升级到已下载的版本. bin/llvm-readobj.exe: error: unknown argument ‘–libs’ 答&…

社交媒体数据分析:解读Facebook用户行为

在当今数字化时代&#xff0c;社交媒体已经成为人们生活不可或缺的一部分&#xff0c;而Facebook作为这个领域的巨头&#xff0c;承载了数十亿用户的社交活动。这庞大的用户群体产生了海量的数据&#xff0c;通过深度数据分析&#xff0c;我们能够深入解读用户行为&#xff0c;…

乐鑫科技业绩超预期修复,Wi-Fi芯片龙头走出“V底”了?

2024年伊始&#xff0c;又到了A股开始业绩披露的时间节点。 尽管A股业绩预告序幕刚刚拉开&#xff0c;但为数不多的企业预告似乎还是透露出某些信号&#xff1a;2023年国内半导体企业的业绩或许并没有想象中的“差”&#xff0c;相反正在逐渐改善。 通过同花顺问财进行筛选发…

php反序列化漏洞基础

一、序列化 serialize(): 序列化是将对象或类转换为字符串的过程,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。 通过序列化,可以将对象或类转换成一串字符串,然后可…

PPO 跑CartPole-v1

gym-0.26.2 cartPole-v1 参考动手学强化学习书中的代码,并做了一些修改 代码 import gym import torch import torch.nn as nn import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from tqdm import tqdmclass PolicyNet(nn.Module):def __…

2024最新PyQt5及其工具(Qt Designer、PyUIC、PyRcc)手把手操作实践指南

2024最新PyQt5及其工具&#xff08;Qt Designer、PyUIC、PyRcc&#xff09;手把手操作实践指南 前言 最近做了一些个人项目&#xff0c;内部逻辑还是挺多的&#xff0c;而且也有想要开源的想法&#xff0c;但是总不能直接把源码端给大家直接运行&#xff0c;有一些需求还有萌…

ubuntu设置每天定时关机

ubuntu设置每天定时关机 终端输入命令&#xff1a; sudo crontab -e输入密码&#xff0c;回车。 我这里使用nano作为编辑器&#xff0c;你可以选择vim。 在末尾输入以下命令&#xff1a; 59 23 * * * sudo -u root shutdown now设置&#xff1a;每天23:59分&#xff0c;电脑…

中科院自动化所:基于关系图深度强化学习的机器人多目标包围问题新算法

摘要&#xff1a;中科院自动化所蒲志强教授团队&#xff0c;提出一种基于关系图的深度强化学习方法&#xff0c;应用于多目标避碰包围(MECA)问题&#xff0c;使用NOKOV度量动作捕捉系统获取多机器人位置信息&#xff0c;验证了方法的有效性和适应性。研究成果在2022年ICRA大会发…

HarmonyOS应用开发者初级认证试题库(鸿蒙)

目录 考试链接&#xff1a; 流程&#xff1a; 选择&#xff1a; 判断&#xff1a; 单选&#xff1a; 多选&#xff1a; 考试链接&#xff1a; 开发者能力认证-职业认证-鸿蒙能力认证-华为开发者学堂 (huawei.com)https://developer.huawei.com/consumer/cn/training/dev-…

计算机导论06-人机交互

文章目录 人机交互基础人机交互概述人机交互及其发展人机交互方式人机界面 新型人机交互技术显示屏技术跟踪与识别&#xff08;技术&#xff09;脑-机接口 多媒体技术多媒体技术基础多媒体的概念多媒体技术及其特性多媒体技术的应用多媒体技术发展趋势 多媒体应用技术文字&…

高斯Hack算法

背景 刷leetcode时&#xff0c;碰到一题需要求解n个bit中选择m个bit的所有组合集&#xff0c;我只想到了递归求解&#xff0c;没啥问题&#xff0c;但是在官方题解中看到了牛逼的方法(Gospers Hack)&#xff0c;故记录一下。 4bit中2个1的情况 0011b0101b0110b1001b1010b1100b…

ASP.NET Core SingleR:初次体验和简单项目搭建

文章目录 前言应用场景SignalR 网站长什么样&#xff1f;第一个ASP.NET core SignalR程序确定SignalR版本新建MVC项目添加unpkg管理器添加客户端添加ChatHub文件添加SignalR服务添加网页运行测试浏览器Websocket调试type1type6Type为其它时 总结 前言 平常的网页通讯都是基于H…