初级代码游戏的专栏介绍与文章目录-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”自动创建:
已经出现了建议的名字,可以改名字,也可以直接回车确认:
这里默认代码抛出了异常,看来跟上面的不是一个人写的。
(这里是文档结束)