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??????????
ns.Navigate(page); //異步導航到某個對象? 也就是new 出來的對象page2
第二種導航的例子
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效果,到時候給大家推薦兩個挺好的工具,后話(如果大家找不到免費版本,我也可以免費傳給大家).
轉載于:https://www.cnblogs.com/chenmengmeng/archive/2012/01/06/2314484.html
總結
- 上一篇: 中金汇财是什么
- 下一篇: Java中的equals学习小结