WPF学习之一
学了一段时间的WPF,虽然没有在项目中运用,就抽时间在博客里记录下来.写博客的目的是增加自己的理解,以便帮助刚学的朋友们,了解一下WPF.
WPF(Windows Presentation Foundation),先了解一下WPF的核心框架.
document service 提供了基于的打印和报表服务,通过这些组件实现自定义的打印和显示效果.
user interface service controls(控件库)关于布局以及数据绑定
core Presentation 包含了2d图形,3d图形,文本,视频,音频,和显示效果,同时还包括了强大的动画效果.
base service 提供了xaml的支持,输入和事件的支持,属性系统等.
WPF核心体系结构和作用
Sharp(图形元素基类) Control(控件模板) Panel(布局基类) 继承自 frameworkElement(框架的属性集,事件集,以及方法集) 继承自 UIElement(数据模板的元素) 继承自 visual(生成可视化对象树) 继承自 DependencyObject(属性系统) 继承自 DispatcherObject(线程分配系统)
WPF中的基本对象 Application \Window \Navigation\Dispacher
Application 和winfrom中的对象类似
window 对象相当于Page对象
Navigation用于页面间的导航控制.
Dispacher对象提供管理线程工作项队列的服务.
关于Application和window对象的简单代码就不写了,今天就写两个小例子,一个关于导航和,一个关于线程的
Navigation是一个导航对象,也就是能像web页面那样支持导航,前进后退等功能,
新添加两个Page页,来演示一下导航的简单用法.
第一个页当导航页使用,第二个页面没什么大的用处,在第一个页的构造函数里面加上 this.KeepAlive = true;这行代码,意思是在导航历史中记录.
添加3个Button,我目前写代码,用到的几个导航的方式,
第一种导航的例子
Page2 page = new Page2(); //new 一个page2的对象 想的于winfrom的跳转页面. //NavigationService ns = NavigationService.GetNavigationService(this); //获得导航器NavigationService 这个this该用什么?(知道的人回一下我) //ns.Navigate(page); //异步导航到某个对象 也就是new 出来的对象page2 this.frameName.NavigationService.Navigate(Page);
第二种导航的例子
NavigationService ns = NavigationService.GetNavigationService(this); ns.Source = new Uri("Page2.xaml", UriKind.Relative); //直接使用Uri地址导航,UriKind.Relative使用一个相对的Uri路径
第三种导航的例子
NavigationService ns = NavigationService.GetNavigationService(this); ns.Content = new Page2(); //直接使用导航对象的Content 直接指向page2页
返回的方法
if (this.NavigationService.CanGoBack) this.NavigationService.GoBack(); //如果有一个返回的条目,就返回
前进的方法
if (this.NavigationService.CanGoForward) this.NavigationService.GoForward(); //如果有下个条目,就导航
刷新也不一样了
this.NavigationService.Refresh(); 需要用NavigationService对象的Refresh方法来刷新.
下面讲一下Dispacher对象,后续会讲,xaml,资源以及样式,绑定,路由,等一些基础的东西,这些基础的内容会在一周内更新完成.
拖一个Label 一个 ProgressBar 一个 Button ,好了,这次就需要一个页面就搞定了,做什么 相信大家已经明白了.
然后 我们只需要在Button的Click事件里面把代码完成了,就行了.
定义一个委托 private delegate void RefUIL(string var);
在Button的Click事件里面加上这个些代码
for (int i = 0; i <= 100; i++) { //WPF中的线程又被封装了 用 Dispatcher来管理,上面已经说了, this.Dispatcher.BeginInvoke(new RefUIL(RefUI), DispatcherPriority.Normal, new string[] { i.ToString() }); System.Threading.Thread.Sleep(100); this.DoEvents(); // 这是自己实现的一个扩展方法 代码下面会解释 }
RefUI方法在这里
//相信这样的代码在winfrom里面写很多,就是跨线程赋值..
private void RefUI(string var) { this.label1.Content = var; this.progressBar1.Value = int.Parse(var); }
下面是一个扩展类 就是扩展window 这个对象
public static class Ext { //一个扩展方法 对Window对象进行扩展 public static void DoEvents(this Window win) { //表示Dispatcher中的执行循环 DispatcherFrame frmae = new DispatcherFrame(); //当前的线程异步执行 并进行回调 如果没有回调 只能执行一次 Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(Exit), frmae); //进入执行循环 Dispatcher.PushFrame(frmae); } /// 让线程继续执行 public static object Exit(object obj) { ((DispatcherFrame)obj).Continue = false; //一个比较有意思的值, false为继续,true为停止 return null; } } //对于这段代码的理解就是,让DispatcherFrame 在Dispatcher执行循环,然后异步回调一个函数,并每次继续执行
WPF系列一,大概分为5篇博客,会把一些基础的东西讲完.然后在考虑将2D,3D,因为我学的时候主要应用是3D效果,到时候给大家推荐两个挺好的工具,后话(如果大家找不到免费版本,我也可以免费传给大家).