WinUI3入门6:子线程处理UI 窗口加载后执行 获取和设置控件尺寸 自动生成事件代码框架

发布于:2025-06-21 ⋅ 阅读:(14) ⋅ 点赞:(0)

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客

C#是我多年以来的业余爱好,新搞的东西能用C#的就用C#了。


        只是几个杂项功能,都不复杂。

目录

一、子线程处理UI

二、窗口加载后执行OnLoad

三、获取和设置控件尺寸

四、如何自动生成事件代码框架


一、子线程处理UI

        我们知道UI只能在UI线程上操作,自己创建的子线程直接调用UI处理可能会引发异常。

        在winforms里用Invoke就可以切换到UI线程执行,在WinUI3则略有不同,需要使用调度队列:

			this.DispatcherQueue.TryEnqueue(() =>
			{
				。。。。。。
			});

        形式上其实很相似,照着替换一下就行了。

二、窗口加载后执行OnLoad

        我们经常希望在窗体创建完毕后做一些处理,比如调整一下控件大小,一般在OnLoad之类处理就可以了。

        然而WinUI3限制很多,并没有OnLoad,Activated事件也不是在界面布局确定之后发生的,那么如何实现窗口加载后处理呢?

        一个通用的做法是用一个定时器,延迟若干毫秒之后执行,一般也是比较可靠的。更简洁的做法是使用调度任务,就像前面子线程处理UI那样,建立一个低优先级任务,就可以保证在界面创建之后尽快执行:

		public MainWindow()
		{
			this.InitializeComponent();
			
            。。。。。。

			//窗口显示之后的任务
			this.DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low,() =>
			{
				resize();
			});
		}

		private void resize()
		{ 
			var button_width = button_do.ActualWidth;
			button_browser.Width = button_width;
			button_cancel.Width = button_width;
			Button_Tmp.Width = button_width;
			button_Hex.Width = button_width;
			button_SaveAs.Width = button_width;
		}

        注意DispatcherQueue.TryEnqueue的第一个参数DispatcherQueuePriority.Low,表示低优先级。

        这种方法比定时器好,感觉不到界面是显示之后发生了变化的。

        原来的效果:

        处理之后的效果:

        所有按钮都一样大了(由于选择的基准的原因,有一个按钮文字显示不全,我们可以通过选取最大的按钮来解决)。

三、获取和设置控件尺寸

        winforms的控件尺寸是可读可写的,读到的就是当前值,写入的就是新值,WinUI3控件尺寸区分实际值和设置值。

        比如上面的代码,获取空间实际宽度用ActualWidth,而Width值因为没有设置过,值是NaN。迁移代码的时候一定要注意。

四、如何自动生成事件代码框架

        如果使用Visual Studio,可以在编辑代码时自动生成事件代码框架。

        在xmal里输入到双引号的时候会自动提供帮助:

        “<新建事件处理程序>”就是自动创建框架出来:

 

        在C#代码里给事件添加处理程序也会自动提供帮助:

 

        提示按“Tab”自动创建:

 

        已经出现了建议的名字,可以改名字,也可以直接回车确认:

         这里默认代码抛出了异常,看来跟上面的不是一个人写的。


(这里是文档结束)


网站公告

今日签到

点亮在社区的每一天
去签到