修改屏幕DPI,會觸發控件的Unloaded/Loaded
現象/重現案例
這裏簡單介紹下,修改屏幕DPI,觸發Unloaded/Loaded的神奇案例
1. 我們新建一個窗口,添加一個UserControl1,然後在UserControl1中添加UserControl2
1 <Window x:Class="WPFUnloadedTriggerTest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WPFUnloadedTriggerTest" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <local:UserControl1></local:UserControl1> 10 </Window> 11 ------------------------------我是分隔線----------------------------------- 12 <UserControl x:Class="WPFUnloadedTriggerTest.UserControl1" 13 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 14 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 15 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 16 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 17 xmlns:local="clr-namespace:WPFUnloadedTriggerTest" 18 mc:Ignorable="d" 19 d:DesignHeight="450" d:DesignWidth="800"> 20 <local:UserControl2></local:UserControl2> 21 </UserControl>
View Code
2. 显示窗口后,修改DPI比例
3. 設置完后,會觸發Unloaded/Loaded重新加載
Unloaded的觸發順序是UserControl1–>UserControl2,Window並不會觸發Unloaded事件!
是不是詭異?我們繼續。。。
4. Window我們添加一個ControlTemplate模塊
1 <Window.Template> 2 <ControlTemplate TargetType="Window"> 3 <Border> 4 <AdornerDecorator> 5 <ContentPresenter /> 6 </AdornerDecorator> 7 </Border> 8 </ControlTemplate> 9 </Window.Template>
再重複2、3步驟,Unloaded的觸發順序變了:
觸發UserControl2的Unloaded,Window、UserControl1並不會觸發Unloaded事件!
問題分析
第2步驟中修改DPI后,Unloaded事件不一定觸發。如何必現呢?
將窗口靠近到任務欄上方,再修改文本比例。
我們查看調用堆棧,貌似是系統給窗口發送消息然後調用BroadcastUnloadedEvent事件,觸發Unload
所以應該是修改DPI,窗口寬高超出了當前屏幕尺寸範圍,系統對UserControl的視覺樹進行重新加載布局。
至於窗口沒有觸發Unloaded、以及在窗口添加以上模塊後下一級子控件也沒有觸發Unloaded事件的原因,暫不了解
而對WPF-Unloaded/Loaded的已知情況如下:
- FrameworkElement, 第一次加載显示時,會觸發Loaded。元素被釋放時,會觸發Unloaded。窗口Show/Close時,視覺樹變化都會觸發加載事件
- MenuItem, 在FrameworkElement基礎上,每次和隱藏MenuItem時,會額外觸發Load/Unloaded
- TabControl,當你選中一個tabItem時會觸發Loaded,當你取消選中一個tabItem時會觸發Unloaded,所以切換Tab時必定有一個Loaded一個Unloaded。
- Expander,每次被Expanded擴展時會引發Loaded,但當隱藏時不會引發Unloaded。
以上問題的解決方案?暫時沒有解決方案,只有規避措施,不要過於依賴於Unload/Loaded,而且使用了Unload/Loaded時也要添加註銷機制,防止重入
我在github提了個issue:
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】
※公開收購3c價格,不怕被賤賣!
※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計
※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務
※Google地圖已可更新顯示潭子電動車充電站設置地點!!