天天看點

把WPF Dialog轉成WinForm Dialog需要注意的問題

最近項目中遇到這樣一個問題。之前有一個用WPF布局好的一個Dialog,如下圖:

把WPF Dialog轉成WinForm Dialog需要注意的問題

但是,由于WPF的Dialog有一些小問題,當顯示Dialog的窗體被别的Active的Application蓋住之後再點TaskBar回來,顯示的Modal Dialog被扔到後面蓋住了。加之我們需要設定Dialog的ShowInTaskBar屬性為False,即不顯示在TaskBar上,使用者就會發現什麼都點不了。

解決這個問題的方法就是把原有的WPF Window轉成UserControl,然後顯示在WinForm窗體上,通過WPFControlHost這個強悍的控件。

轉換完成之後就可以避免之前Dialog切換的問題。但是,新的問題又來了。新的Dialog看起來總是很不爽,如下圖示,所有的字型都發生了變化,導緻原來調試好的布局亂掉了

把WPF Dialog轉成WinForm Dialog需要注意的問題

推測可能跟UserControl從WinForm繼承了不同的Font導緻的這個問題。目前已知WinForm控件的預設字型是Control.DefaultFont (“Microsoft Sans Serif, 8.25f”), 查了一下WPF控件的FontFamily/FontSize等DependencyProperty的聲明,原來這些屬性預設值如下:

FontFamily:SystemFonts.MessageFontFamily

FontSize: SystemFonts.MessageFontSize

FontStretch: SystemFonts.MessageFontStretch

FontStyle: SystemFonts.MessageFontStyle

這樣一來就清楚了。WPF下的控件預設字型和WinForm是不同的,在英文機器上,這個預設字型是(“Segoe UI, 12f”)。

是以我們需要修正Host在WinForm上的WPF UserControl的Font。

這個過程就比較簡單了。使用DynamicResource綁定系統的SystemFonts的資源Key就可以了,需要添加的XAML如下:

完成之後Launch新的Dialog,之前的布局又回來了。

把WPF Dialog轉成WinForm Dialog需要注意的問題

到這裡,将WPF下的Dialog轉換成WinForm的Dialog基本完成。細心的TX可能發現還有不同,Dialog的背景一個是白一個是灰。這個問題也和兩個平台下窗體的預設Background不同有關。解決方案同Font,這裡就不再贅述。