WPF小知識
1、在xaml代碼中,我們可以看到有一個
2、如何在啟動程序時決定先顯示哪個窗體呢?答案是Application類的StartupUri 屬性;
3、如何在WPF應用程序中設計出不同風格的界面?
答案是,我們只需要將這些設計要素(資源)放在Application的Resources屬性中即可;
4、App.xaml,這個非常關鍵,它就代表當前應用程序本身:
應用程序的App.xaml前端代碼,StartupUri="MainWindow.xaml"表示本程序第一個啟動的窗體是MainWindow
5、當我們啟動WPF應用時,首先被執行的是OnStartup方法,其次是OnActivated方法,如果我們把當前應用最小化或切換到其它程序時,這時OnDeactivated會被執行,再切回來時再次執行OnActivated方法,最后,當我們關閉程序時,OnDeactivated會再次被執行,最后執行的是OnExit方法;
Application的生命周期:
OnStartup->OnActivated->OnDeactivated->OnExit
6、Window窗體的生命周期
SourceIntialized4 -> Activated -> Loaded -> ConentRendered -> Deactivated -> Closing -> Deavtivated -> Closed
7、在C#的世界里,除了object,沒有人敢稱終極父類,而在WPF的世界里,DispatcherObject坐上了頭把交椅。這個類位于程序集:WindowsBase.dll中,根據微軟官網資料顯示,DispatcherObject繼承于object,雖然它在WPF框架算是終極父類,但在整個.NET中來看,仍然只不過是千年老二
8、作為DispatcherObject類的成員Dispatcher(調度員)又提供了哪些功能?簡單點說,它便是后臺線程和前臺線程的架海紫金梁,雖然所有的控件都必須在前臺UI線程中創建,但是在開發過程中,難免需要在后臺線程中去操作控件,于是Dispatcher調度員提供了Invoke和BeginInvoke兩個方法,供我們可以安全的訪問UI線程中的控件
9、事件驅動模式:在需要的時候主動去改變控件的值的開發模式
10、數據驅動模式?控件的屬性不再被直接賦值,而是綁定了另一個”變量“,當這個”變量“發生改變時,控件的屬性也會跟著改變,這樣的屬性也被稱為依賴屬性;
幾乎WPF控件的所有屬性都可以采用這種模式去更新屬性的值,因為所有控件都繼承了DependencyObject這個基類
11、protected internal 關鍵字組合是一種成員訪問修飾符, 表示受保護的內部成員。
12、UIElement基類定義了大量的路由事件。關于這些事件的回調函數,即以On開頭的方法成員,都被聲明成了protected virtual,意思是他們都可以被重載,這使得我們在開發業務時更加方便
13、Visibility實際上是一個枚舉,它包含3個值,分別是Visible、Hidden、Collapsed。其含義分別是顯示、隱藏、徹底隱藏(不占布局位置);
14、UIElement基類為我們提供了一系列的鼠標、鍵盤和觸摸事件,并提供了一些常用的依賴屬性。它可以呈現繼承它的所有控件,為控件布局時調整位置和大小,響應用戶的輸入,引發一系列的路由事件,并繼承了IAnimatable動畫接口,用于支持動畫的某些方面。
15、組件的Tag屬性:這個屬性非常重要,它是object類型,意味著可以保存任意類型的對象值。它就像FrameworkElement類身上的一個小口袋,但確能容納萬物。我們通常會將一些與控件相關的數據臨時存放在Tag屬性中,當把控件作為參數傳遞時,小口袋里面的對象也隨之傳遞過去了。
16、組件Style屬性:獲取或設置此元素呈現時所使用的樣式。
與Style相關的還有一個屬性,叫FocusVisualStyle,顧名思義,控件在獲得焦點時的樣式。
17、什么是資源?資源,也就是資源字典,也就是ResourceDictionary類,它提供一個哈希表/字典實現,其中包含組件所使用的 WPF 資源以及 WPF 應用程序的其他元素。我們可以把WPF的控件、窗體、Application應用所用到的一切資源都放在其中,將多個ResourceDictionary元素合并起來形成一個ResourceDictionary元素(ResourceDictionary也是一個隱式集合);
18、假定我們有一個View窗體,窗體有一個TextBox控件;又假如我們還有一個ViewModel實體,這個實體中有一個叫Name的屬性。如果我們要將TextBox控件的Text屬性和ViewModel實體的Name屬性成功的建立綁定關系,必備的條件是什么?
View窗體繼承于FrameworkElement類,所以每個窗體(或控件)都有一個叫DataContext的數據上下文屬性。所以必備的條件是:ViewModel實體必須先賦值給View窗體的DataContext,ViewModel的Name屬性才能綁定到TextBox控件的Text屬性
19、Panel其實是一個抽象類,不可以實例化,WPF所有的布局控件都從Panel繼承而來
Panel提供了GetZIndex和SetZIndex方法成員,分別表示獲取某個元素的ZIndex順序和設置某個元素的ZIndex順序:
20、什么是ZIndex?這是Panel提供的一個附加屬性。假如一個單行單列的Grid布局控件中有兩個Button,正常情況下,這兩個Button都會以撐滿Grid的方式呈現在Grid中,那么,到底哪一個Button在上面,哪一個Button在下面呢?就看這兩個Button的Panel.ZIndex附加屬性的值,值越大越在上面,而值較小的那個Button將被上面的Button遮蓋,從而在視覺上,用戶只能看到一個Button。
21、有一個非常非常需要注意的事項,那就是Panel的Background屬性。有時候我們希望在布局控件上實現鼠標點擊事件的獲取,請記得一定要給Background屬性設置一個顏色值,如果不希望有具體的顏色,那就設置成Transparent 。不然,您會踩坑的!因為布局控件的Background屬性沒有值時,是不能引發鼠標相關事件的。
22、只要繼承于UIElement的類(或控件),都可以添加到Panel或Panel子類的Children中,從而在前端呈現出來。
如果不需要進行復雜的布局,則盡量少用復雜布局控件(如 Grid和自定義復雜的Panel);如果能簡單布局實現就盡量使用構造相對簡單的布局(如 Canvas、UniformGrid等),這種布局可帶來更好的性能。 如果有可能,我們應盡量避免調用 UpdateLayout方法。
23、Grid網格布局組件:
-Grid有兩個非常關鍵的屬性ColumnDefinitions和RowDefinitions,分別表示列的數量集合和行的數量集合
-默認的Gridr控件沒有定義行數和列數,也就是說,Grid默認情況下,行數和列數都等于1,那么它就只有一個單元格
24、WrapPanel的子元素的高度和寬度都是根據子元素自身內容的尺寸呈現。另外,當WrapPanel處于水平排列時,子元素的HorizontalAlignment是不起作用的。
25、Control類雖然可以實例化,但是在界面上是不會有任何顯示的。只有那些繼承了Control的子類(控件)才會在界面上顯示,而且所呈現的樣子各不相同,為什么會是這樣呢?
因為Control類提供了一個控件模板(ControlTemplate),而幾乎所有的子類都對這個ControlTemplate進行了各自的實現,所以在呈現子類時,我們才會看到Button擁有Button的樣子,TextBox擁有TextBox的樣子
26、Control類還提供了兩個事件,它們分別是PreviewMouseDoubleClick和MouseDoubleClick:
以Preview開頭的事件叫隧道事件或預覽事件,而MouseDoubleClick沒有以Preview開頭,所以它叫冒泡事件;
-WPF的前端代碼其實是一棵樹,當我們在某個目標控件上進行鼠標操作時,所引發的事件有兩個方向,一是從Winow根節點一直路由到目標控件上,看起來就好像是從外面一直沿著這棵樹路由引發至里面,這就像我們開車進入隧道一樣,所以Preview開頭的事件叫隧道事件。冒泡事件事件的路由方向相反,是從目標控件位置開始,一直路由引發至最外層的Window窗體
27、對于文本的顯示,除了可以在Label中顯示,我們還有一個控件也可以實現,那就是TextBlock文字塊。而且,TextBlock控件直接從FrameworkElement基類繼承而來,效率比Label標簽更高
28、WPF幾乎所有控件都可以擁有ToolTip小型提示彈窗!
29、打開一個外部網站:
Process.Start("http://www.wpfsoft.com");

浙公網安備 33010602011771號