在Visual Studio中创建WPF应用程序,项目包括App和MainWindow两组文件。每组文件包括Xaml文件和cs文件,其中App.xaml文件的内容如下。
- <Application x:Class="WpfApplication2.App"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- StartupUri="MainWindow.xaml">
- <Application.Resources>
- </Application.Resources>
- </Application>
<Application x:Class="WpfApplication2.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>
- XAML文件内容 Xaml文件是xml文件的扩展,App.Xaml文件默认定义了两个名字空间xmlns和xmlns:x以及应用程序的启动窗口MainWindow.xaml. MainWiondow.xaml的内容如下。
- <Window x:Class="WpfApplication2.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="MainWindow"
- mc:Ignorable="d"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- Height="700"
- Width="1000">
- <Button Content="Button" Height="62" Name="button1" Width="110" Click="button1_Click" />
- </Window>
它引入了额外的两个名字空间,同时定义了窗口的高度和宽度。同时,MainWindow包含了我们定义的一个按钮,它的名字是Button1,按钮点击的响应事件是button1_Click。<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Height="700" Width="1000"> <Button Content="Button" Height="62" Name="button1" Width="110" Click="button1_Click" /> </Window>
- WPF程序执行过程
程序在执行完WPF程序默认定义的App类构造函数后,将自动跳转到主窗口执行。
- WPF程序编译
在WPF应用程序编译时,Xaml文件首先被编译为g.cs文件。例如,App.Xaml被编译为App.g.cs。 App.g.cs和App.cs一起编译生成WpfApplication2.exe。
[csharp] view plain copy
- <pre class="csharp" name="code" snippet_file_name="blog_20140218_3_8384257" code_snippet_id="193861">namespace WpfApplication2 {
- /// <summary>
- /// App
- /// </summary>
- [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
- public partial class App : System.Windows.Application {
- /// <summary>
- /// InitializeComponent
- /// </summary>
- [System.Diagnostics.DebuggerNonUserCodeAttribute()]
- public void InitializeComponent() {
- #line 4 "..\..\..\App.xaml"
- this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
- #line default
- #line hidden
- }
- /// <summary>
- /// Application Entry Point.
- /// </summary>
- [System.STAThreadAttribute()]
- [System.Diagnostics.DebuggerNonUserCodeAttribute()]
- public static void Main() {
- WpfApplication2.App app = new WpfApplication2.App();
- app.InitializeComponent();
- app.Run();
- }
- }
- }</pre>
- <pre></pre>
- <p></p>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
当新建一个wpf应用程序,会自动生成一个App.xaml和MainWindow.xaml文件
其中App.xam用来设置Application,应用程序的起始文件和资源及应用程序的一些属性和事件的设置,app.xaml.cs是处理应用程序的相关资源和事件
MainWindow.xaml是相应的窗体文件
app.xaml及app.xaml.cs主要通过操作application对象来控制应用程序
application对象包含:Activated 当应用程序成为前台应用程序时发生。
Deactivated 当应用程序停止作为前台应用程序时发生。
DispatcherUnhandledException 在异常由应用程序引发但未进行处理时发生。
Exit 恰好在应用程序关闭之前发生,且无法取消。
FragmentNavigation 当应用程序中的导航器开始导航至某个内容片断时发生,如果所需片段位于当前内容中,则导航会立即发生;或者,如果所需片段位于不同内容中,则导航会在加载了源 XAML 内容之后发生。
LoadCompleted 在已经加载、分析并开始呈现应用程序中的导航器导航到的内容时发生。
Navigated 在已经找到应用程序中的导航器要导航到的内容时发生,尽管此时该内容可能尚未完成加载。
Navigating 在应用程序中的导航器请求新导航时发生。
NavigationFailed 在应用程序中的导航器在导航到所请求内容时出现错误的情况下发生。
NavigationProgress 在由应用程序中的导航器管理的下载过程中定期发生,以提供导航进度信息。
NavigationStopped 在调用应用程序中的导航器的 StopLoading 方法时发生,或者当导航器在当前导航正在进行期间请求了一个新导航时发生。
SessionEnding 在用户通过注销或关闭操作系统而结束 Windows 会话时发生。
Startup 在调用 Application 对象的 Run 方法时发生。
app.xaml页面是全局可以应用的页面,可以在此页面定义全局的各种样式<Style TargetType="Button" x:Key="abc">
</Style>这样的定义可以应用到整个项目所有button样式。
对于初次面对这么一个曾未接触的wpf项目,我们的历程是艰辛的,但我们的收获是不菲的,就学术型的收获就已经比我在学校课堂的收获多很多啊!现在我技术总结在此,以便留作技术总结。
首先,我们在vs2010的软件环境下开发我们的wpf项目,首先我们了解了一下wpf,它是微软基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。wpf可以做出很多2D/3D的很炫酷的界面,可以开发桌面应用程序也可以做浏览器应用程序。在vs2010中可以利用blend 做到界面设计和代码开发的很好分离。可以使有任何一种.Net编程语言(C#,VB NET等开发语言)进行开发。XAML主要针对界面的可视化控件描述,成生进会分析成.cs或.vb文件,并最后将编译为CLR中间运行语言。他对于widows应用程序的开发是一个革命性的改变。对于以后的应用程序的开发至关重要。
我们建立好我们wpf项目,一开始在我们初步设计方案下搭好基本wpf框架,并实现最简单的连接,但是接下来我们遇到第一问题:我们一开始在不知情的情况下,都是做的是windows窗体,做窗体的连接时,我们开始采用NavigationService.Navigate(new Uri("lose.xaml", UriKind.Relative));进行页面跳转,可以怎么也实现不了,最后网上查询才明白,以上跳转是对于page,而对于windows窗体的跳转,只能用窗体的close/hide事件和show事件:lose c1 =new lose();c1.show();this.close(); 其实对于wpf有7种xaml文件,窗体windows(它是wpf最基本的界元素),<Window x:Class="WpfBrowserApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
</Grid>
</Window>page页
<Page x:Class="WpfBrowserApplication1.Page2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="Page2">
<Grid>
</Grid>
</Page> 他是是页面型的文件,并不是窗体,一个窗体可以加载多个page页,及我们所有的page可以共用一个windows窗体。只是我们需要将windows页面<Windowx:Class="WpfBrowserApplication1.Window1" </Window>改为<NavigationWindow x:Class="WpfBrowserApplication1.Window1"
</NavigationWindow>;多个page页就可以继承windows;
usercontrol用户控件页面<UserControl x:Class="WpfBrowserApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
</Grid>
</UserControl>这是用户控件页面,他是为开发人员提供自定义用户控件的页面,可以直接添加到要使用的windows窗体中
<Window x:Class="WpfApplicationDemo.UserControlDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:WpfApplicationDemo.Control" Title="UserControlDemo" Height="300" Width="300" Loaded="Window_Loaded"> <Grid> <TextBlock Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBlock1" Text="下面是用户控件" VerticalAlignment="Top" /> <StackPanel Height="175" HorizontalAlignment="Left" Margin="20,57,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="246" /> <my:UserControl1 HorizontalAlignment="Left" Margin="38,46,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="183" Width="406" /> </Grid> </Window>
ResourceDictionary资源字典页面
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</ResourceDictionary>在 Silverlight 中,并非所有类型和对象都适合 ResourceDictionary 用法。 为了在 ResourceDictionary 中定义某个对象并从其中访问该对象,该对象必须成为可共享的对象。 可共享是必须的,因为当在运行时构造并使用应用程序的对象树时,对象不能存在于多个树中的位置。作为资源而使用,资源字典的对象必须受 Silverlight 资源共享行为或诸如对象引用的间接机制的支持。这些机制都需要额外代码的支持。 从 UIElement 类型派生的任何对象在本质上都不是可共享的,除非该对象是从控件模板生成的(Silverlight 控件模板化子系统是间接机制的一个突出示例)。一般支持样式,模板,画笔,颜色,动画类型,转换等。他的使用也很简单,在使用页xaml代码中插入: <Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyDictionary1.xaml"/>
<ResourceDictionary Source="MyDictionary2.xaml"/>
<ResourceDictionary Source="Mydictionary3.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
我们终于解决了页面跳转的问题,由于考虑到我们页面跳转位置不会随机,我们采用的是page页,只是用一个公共的windows进行加载。