初級代碼游戲的專欄介紹與文章目錄-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”自動創建:
?
? ? ? ? 已經出現了建議的名字,可以改名字,也可以直接回車確認:
? ? ? ? ?這里默認代碼拋出了異常,看來跟上面的不是一個人寫的。
(這里是文檔結束)