對於WPF的技術筆者是又愛又恨。現在WPF的市場並不是很錦氣。如果以WPF來吃飯的話,只怕會餓死在街頭。同時現在向面WEB開發更是如火沖天。所以如果是新生的話,最好不要以WPF為主。做為選擇性來學習一下還是可以的。
WPF項目
在VS開發工具里面對於WPF應用相關的項目類型有三種。本來在筆者看來他可能會單獨存在一個地方,后來想想也對,WPF也算是Window開發吧。那么WPF的三種項目類型都在模板Window節點下也是正常的。如下

對於"WPF 應用程序"項目相信大家都知道——執行項目。唯一筆者不明白的事為什么會有倆個控件庫項目。明文上我們可以看到一個是用戶,一個是自定義。那么倆者之間有什么不同的地方嗎?筆者是這樣子理解的:用法上來講用戶控件主要用於業務上的重用。這跟Winform用戶控件有一點類似。很多控件都是當前存在的。土氣講就是把原本就有的控件拉到同一個框中組成了新的控件。而自定義控件則是在原來控件上在進一步的繼承擴展。相當於說是一個全新的控件。功能上來講不管理用戶還是自定義倆者都可以實現對方的功能。但是在筆者看來自定義會來的深一些。自定義控件會去重新設定Style和Template。(為了更好的理解可以去 這里) 所以在新建項目之后會存在一定的差別。如下
用戶控件項目

自定義控件項目

不管是WinForm開發還是WPF開發。我們都能看到Application類的影子。這種作法筆者真的不是很喜歡。很容易把倆者放在一起。新建一個WPF應用項目之后,會生成倆個Xaml文件。如下

App.xaml就是一個繼承Application類的子類。對應的WPF運行都要通他來完成了。但是往往很有多人不是很喜歡WPF默認的這種方式。總是想要變成WinForm類似的方式啟動。可能還是忘不了WinForm吧。至少筆者也有一點。如何去實現呢?
即然都是Window應用開發的話,筆者想一定離不開Main函數吧。可是筆者點開了相關的源碼文件,硬是沒有找到相應的Main函數。后來通過下面的方式找到了。原來在App.g.i.cs文件里面。也因此了解了。App.Xaml是有屬性類型的。

所謂的屬性類型是指App.xaml的屬性中的“生成操作”部分。我們可以發現他默認是ApplicationDefinition。只要是ApplicationDefinition的話,他就是會默認生成Main函數。如下。

明白了上面的機制之后就簡單多了。把App.xaml的屬性設置成Page,同時創建一個叫Program類。代碼如下。
public class Program { [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] public static void Main() { WpfApplication2.App app = new WpfApplication2.App(); app.InitializeComponent(); app.Run(); } }
從上面的講述中,我們可以知道一點:App.xaml好像是有種類的。如果是一個ApplicationDefinition的話,就可以啟動項目直接調用。即是你把Main函數刪除掉他也可以自動幫你生成。如果是Page的話,那就SORRY了。你必須自己手動增加Main函數。這對於一個.NET開發人員來講並不難。正如筆者所講的就跟Winfrom入口函數一個樣子。
WPF界面
WPF在外觀的編程做法是讓筆者最滿意的地方。他不在像傳統WinForm那樣子死板。而引入類似於B/S模式的方式。相信大家都聽過CSS樣式。沒有錯。很像。什么意思呢?WinForm的界面編輯可以說決對是一個很死板的方式。WPF界面引用了XAML來編輯。也許也正因為這樣子才讓界面更加的獨立起來。同時讓我們在美化界面更加的靈動和方便 。因為他也有一個跟HTML網頁一樣子的概念——樣式(Style)。如下(引用於開源項目(Modern UI for WPF))
1 <Style x:Key="SystemButton" TargetType="ButtonBase" BasedOn="{StaticResource SystemButtonBase}"> 2 <Setter Property="Width" Value="32" /> 3 <Setter Property="Height" Value="24" /> 4 <Setter Property="Foreground" Value="{DynamicResource ButtonText}"/> 5 <Style.Triggers> 6 <Trigger Property="IsMouseOver" Value="True"> 7 <Setter Property="Background" Value="{DynamicResource ButtonBackgroundHover}" /> 8 <Setter Property="Foreground" Value="{DynamicResource ButtonTextHover}"/> 9 </Trigger> 10 <Trigger Property="IsPressed" Value="True"> 11 <Setter Property="Background" Value="{DynamicResource ButtonBackgroundPressed}" /> 12 <Setter Property="Foreground" Value="{DynamicResource ButtonTextPressed}" /> 13 </Trigger> 14 <Trigger Property="IsEnabled" Value="false"> 15 <Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}" /> 16 </Trigger> 17 </Style.Triggers> 18 </Style>
上面只是定一個叫SystemButton的樣式。主要用於修飾按扭的。他跟CSS樣式的類樣式有點類似。使用的話更不用說了。如下紅色的SystemButton。
<Button x:Name="Maximize" Command="{Binding Source={x:Static SystemCommands.MaximizeWindowCommand}}" ToolTip="{x:Static modernui:Resources.Maximize}" Style="{StaticResource SystemButton}" >
我們都知道HTML網頁如果想要引用CSS樣式文件的話,就必須在頭部聲明引用。這樣子才可以知道當前的界面是引用了哪一個CSS樣式文件。不可否認WPF的界面同樣子類似的。只是引用的文件不在叫CSS樣式文件,而是叫資源文件。這個后續會筆者會在講到。不過B/S和C/S本質上還是有一定的差別的。至少他可以聲明一個作用於整個應用程序的資源文件。如下
<Application x:Class="FirstFloor.ModernUI.App.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" /> <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application
啟動WPF應用程序就必須通過Application類或子類。執行Application類他會去尋找窗體。上面源碼中StartupUri="MaiWindow.xaml"就體現出來了。當然不可能就必須這樣子做。你們可以用代碼來做。
在WinForm的時候,一個應用軟件是有若干個Form組起的。而WPF界面則不一定哦。你可以是有一個Window和若干個UserControl或是若干個Page。至於你們選擇哪一種方式來做的話,只要項目適合的話都可以。如果實在不清楚的話,你可以跟根據開源項目Modern UI for WPF來做。他就是一個Window和多個UserControl組成的。(Window相當於Form)
筆者開始入門的時候,並沒有直接去查看開源項目。而是先把VS新建生成的了解了一遍。至少你要知道在什么地方啟動。以什么樣子的方式啟動。界面又是什么入手的。明白了VS的源生狀。就是可以開始啟動開源項目的學習了。
