ImageVerifierCode 换一换
格式:DOCX , 页数:71 ,大小:347.11KB ,
资源ID:3812412      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3812412.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(WPF+学习笔记.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

WPF+学习笔记.docx

1、WPF+学习笔记WPF 学习笔记目录WPF 学习笔记 1Application 1Dispatcher 3Navigation 5XAML 9DependencyProperty 15RoutedEvent 20Resource 24Binding 31Silverlight - Hello, World! 68Application和 WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain 中只能有一个 Application 实例存在。和 WinForm 不同的是 WPF Application 默认由两部分组成 : App

2、.xaml 和 App.xaml.cs,这有点类似于 Delphi Form,将定义和行为代码相分离。当然,WebForm 也采用了类似的方式。XAML 从严格意义上说并不是一个纯粹的 XML 格式文件,它更像是一种 DSL,它的所有定义都直接映射成某些代码,只不过具体的翻译工作由编译器完成而已。下面是一个简单的 App 定义。public partial class App : Application当你在自动生成的 Project 代码中看到 paritial 时,应该下意识去找找 This code was generated by a tool. 不过这次自动生成的代码存放位置更加古怪

3、 objDebugApp.g.cs。public partial class App : System.Windows.ApplicationDebuggerNonUserCodepublic void InitializeComponent()this.StartupUri = new System.Uri(Window1.xaml, System.UriKind.Relative);STAThreadDebuggerNonUserCodepublic static void Main()App app = new App();app.InitializeComponent();app.Ru

4、n();App.StartupUri 用于设置 MainWindow,App.Run() 启动消息循环。当然,还有那个 STAThread,这意味着 WPF 依旧使用一个 UI Thread 来处理 UI Message。我们完全可以舍弃自动生成的代码,自己手工写一个 App。public class App : ApplicationSTAThreadprivate static void Main()var app = new App();var window = new Window Title = WPF ;app.Run(window);Application 提供了一些实用的属性和

5、方法。Current: 获取 Domain 中默认的 Application 实例。MainWindow: 获取主窗口实例。Windows: 获取所有被实例化的 Window 实例。ShutdownMode: 指定 Application.Shutdown 方式,包括主窗体关闭,最后一个窗口关闭,以及手工调用 Shutdown()。Properties: 一个线程安全的全局字典,可用来存储一个公共信息。Shutdown: 该方法终止 Application Process,可向操作系统返回一个退出码。我们依然可以使用 Mutex 来阻止运行多个实例。private void Applicati

6、on_Startup(object sender, StartupEventArgs e)var createdNew = false;var name = Assembly.GetEntryAssembly().FullName;new Mutex(true, name, out createdNew);if (!createdNew)MessageBox.Show(There is already an instance running, Exit!);Application.Current.Shutdown();当然也可以用 Windows 属性判断窗体是否已经存在。private vo

7、id button1_Click(object sender, RoutedEventArgs e)var window2 = Application.Current.Windows.OfType().FirstOrDefault(w = w is Window2);if (window2 = null) window2 = new Window2();window2.Show();window2.Activate();-无聊的分割线-迟到的笔记总算开始了,算是为 Silverlight 做准备吧。DispatcherWPF 使用一个专用的 UI 线程来完成界面的操作和更新,这个线程会关联一个

8、唯一的 Dispatcher 对象,用于调度按优先顺序排列的工作项队列。Application.Run() 实际上就是对 Dispatcher.Run() 的间接调用。Dispatcher 通过循环来处理工作项队列,这个循环通常被成为 帧 (DispatcherFrame)。Dispatcher.Run() 创建并启动这个帧,这也是 Application.Run() 启动消息循环的最终途径。public sealed class DispatcherSecurityCritical, UIPermission(SecurityAction.LinkDemand, Unrestricted=t

9、rue)public static void Run()PushFrame(new DispatcherFrame();DispatcherFrame 可以嵌套,并通过检查 Continue 属性来决定循环是否继续。我们可以通过调用 Dispatcher.ExitAllFrames() 来终止所有的帧循环,当然这种编程方式并不可取,可能会造成一些意外出现。与 Dispatcher 调度对象想对应的就是 DispatcherObject,在 WPF 中绝大部分控件都继承自 DispatcherObject,甚至包括 Application。这些继承自 DispatcherObject 的对象具有

10、线程关联特征,也就意味着只有创建这些对象实例,且包含了 Dispatcher 的线程(通常指默认 UI 线程)才能直接对其进行更新操作。当我们尝试从一个非 UI 线程更新一个标签,会看到一个如下的异常。private void button1_Click(object sender, RoutedEventArgs e)new Thread() = this.label1.Content = DateTime.Now.ToString().Start();按照 DispatcherObject 的限制原则,我们改用 Window.Dispatcher.Invoke() 即可顺利完成这个更新操作

11、。private void button1_Click(object sender, RoutedEventArgs e)new Thread() =this.Dispatcher.Invoke(DispatcherPriority.Normal,new Action() = this.label1.Content = DateTime.Now.ToString();).Start();如果在其他项目(比如类库)中,我们可以用 Application.Current.Dispatcher.Invoke(.) 完成同样的操作,它们都指向 UI Thread Dispatcher 这个唯一对象。D

12、ispatcher 还提供了 BeginInvoke 这个异步版本。private void button1_Click(object sender, RoutedEventArgs e)new Thread() =Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new Action() =Thread.Sleep(3000);this.label1.Content = DateTime.Now.ToString(););MessageBox.Show(Hi!);).Start();凡事都有例外,WPF

13、还提供了一种继承自 Freezable 的类型,尽管 Freezable 也间接继承自 DispatcherObject,但当这类对象从修改状态变成冻结状态时,它即变成自由线程对象,不在具有线程关联。(有关 Freezable 详情可参考 MSDN)Navigation互联网的兴起,造就和培养了一种新的用户交互界面 Page & Navigation。无论是前进、后退还是页面,都完全是一个全新的门类,不同于以往的 SDI/MDI。WPF 或者是它的简化版 Silverlight 都不可避免地遵从了这种改良的 B/S 模式,使用 URI 来串接 UI 流程。NavigationService、P

14、age、Hyperlink、Journal(日志/历史记录) 是 WPF 整个导航体系的核心。NavigationService 提供了类似 IE Host 的控制环境,Journal 可以记录和恢复相关 Page 的状态,我们通常会选用的宿主方式包括:Browser(XBAP) 和 NavigationWindow。1. NavigationWindowNavigationWindow 继承自 Window,不知什么原因,我并没有在 VS2008 New Item. 中找到相关的条目,只好自己动手将一个 Window 改成 NavigationWindow。Window1.xaml Sour

15、ce 属性指定了该窗口的默认页面,当然,我们还要修改一下 Window1.xaml.cs 里的基类。public partial class Window1 : NavigationWindowpublic Window1()InitializeComponent();创建一个 Page1.xaml,我们就可以像普通 Window 那样添加相关的控件和操作。2. Hyperlink超链接应该是我们最熟悉的一种导航方式。Page1.xaml Page2NavigateUri 相当于 Html a.href,当然我们也可以使用 Hyperlink.Click 事件,然后使用 NavigationS

16、ervice 来完成导航操作。Page1.xaml Page2Page1.xaml.cs private void Hyperlink_Click(object sender, RoutedEventArgs e)this.NavigationService.Navigate(new Uri(Page2.xaml, UriKind.Relative);Hyperlink 还支持 test.htm#name 这样的导航定位方式,滚动页面直到某个特定名称的控件被显示。Hyperlink 的另外一个实用属性是 Command,我们可以使用 NavigationCommands 中创建的一系列静态成员

17、来执行一些常用操作。RefreshBrowseBackBrowseForward3. NavigationService很多时候我们都需要使用 NavigationService 代替 Hyperlink.NavigateUri,比如非默认构造的 Page,动态确定目标页面等等。我们可以使用 Page.NavigationService 或者 NavigationService.GetNavigationService() 获得 NavigationService 的实例引用 (别忘了添加 using System.Windows.Navigation)。public partial clas

18、s Page1 : Pageprivate void Hyperlink_Click(object sender, RoutedEventArgs e)var page2 = new Page2();page2.label1.Content = Beijing 2008!;this.NavigationService.Navigate(page2);除了 Navigate(),还可以使用 NavigationService 的两个属性完成导航切换操作。/this.NavigationService.Content = page2;this.NavigationService.Source =

19、new Uri(Page2.xaml, UriKind.Relative);NavigationService 提供了大量的方法和时间来管理相关导航操作。日志: AddBackEntry、RemoveBackEntry。载入: Navigate、Refresh、StopLoading。切换: GoBack、GoForward。事件: Navigating(新导航请求时触发,可取消导航)我们也可以使用 Application 的相关事件来处理导航过程。4. JournalJournal 相当于 WebBrowser.History,它包含两个数据栈用来记录前进和后退页面的显示状态,每个相关 Pa

20、ge 都会对应一个 JournalEntry。日志状态自动恢复仅对单击导航条上前进后退按钮有效。5. Page有关 Page 本身的使用并不是本文的内容,我们此处关心的是它在导航过程中的生命周期。在 WPF 中,Page 注定是个短命鬼,无论我们使用导航还是后退按钮都会重新创建 Page 对象实例,然后可能是日志对其恢复显示状态。也就是说日志只是记录了 Page 相关控件的状态数据,而不是 Page 对象引用(默认情况下)。有两种方式来维持一个 Page 引用。第一种就是我们自己维持一个 Page 引用,比如使用某个类似 Application.Properties 这样的容器。private

21、 void Hyperlink_Click(object sender, RoutedEventArgs e)var page2 = Application.Current.Propertiespage2 as Page2;if (page2 = null)page2 = new Page2();page2.label1.Content = DateTime.Now.ToString();Application.Current.Propertiespage2 = page2;this.NavigationService.Navigate(page2);/this.NavigationServi

22、ce.Content = page2;另外一种就是设置 Page.KeepAlive 属性,这样一来日志会记录该 Page 的引用,当我们使用前进后退按钮时,将不会再次创建该 Page 的对象实例。有一点需要注意:该方法仅对前进后退等日志操作有效。如果我们使用 HyperLink.NavigateUri 或 NavigationService.Navigate() 导航时依旧会生成新的页面实例,并可能代替日志中最后一个同类型的对象引用记录。另外,当多个页面存在循环链接时,会导致多个页面实例被日志记录,造成一定的内存浪费。6. FrameFrame 的作用和 HTML 中的 IFrame 类似,

23、我们可以用它在一个普通的 Window 或 Page 中嵌套显示其他的 Page。默认情况下,Frame 会尝试使用上层页面(Page)或窗体(NavigationWindow)的日志,当然我们也可以使用 JournalOwnership 属性强行让 Frame 使用自己的日志导航。Frame 的另外一个作用就是可以导航到 HTML 页面,我们可以把它当作一个嵌入式 IE WebBrowser 来使用。7. PageFunctionWPF 提供了一个称之为 PageFunction 的 Page 继承类来实现类似 HTML showModal 的功能。我们可以用它来收集某些数据并返回给调用页,

24、当然这个封装其实非常简单,我们完全可以自己实现,无非是提供一个类似 OnReturn 的方法实现而已。泛型参数 T 表示返回数据类型。Page1.xaml.cs public partial class Page1 : Pageprivate void Hyperlink_Click(object sender, RoutedEventArgs e)var modal = new PageFunction1();modal.Return += (s, ex) = this.label1.Content = ex.Result.ToString();this.NavigationService.

25、Navigate(modal);PageFunction1.xaml.cs public partial class PageFunction1 : PageFunctionprivate void button1_Click(object sender, RoutedEventArgs e)OnReturn(new ReturnEventArgs(DateTime.Now.Millisecond);使用步骤:(1) 创建 PageFunction 对象实例,当然我们可以使用含参构造传递额外的数据;(2) 调用 PageFunction.OnReturn() 方法用来返回一个特定的结果包装对象 ReturnEventArgs;(3) 调用者通过订阅 Page

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1