VS2010 教程:創建一個 WPF 應用程序 (第一節)

來自:https://msdn.microsoft.com/zh-cn/library/ff629048.aspx


[原文發表地址]?VS2010 Tutorial: Build a WPF App (Step 1)

[原文發表時間] Friday, May 22, 2009 8:00 AM

這篇文章里,我將使用VS2010 Beta 1創建一個WPF 應用程序。并且 我將展示這個產品里的一些新的特性。我寫的這個Demo使用的是Winodows7 RC的Beta1這個版本。這個程序同時也能適用于其他的操作系統。

如果你還沒有下載這個軟件。請訪問?Brian Keller?第九頻道,在那里你會找到詳細的步驟教你如何來作。Brian描述了怎樣去安裝完整的產品,包括 TFS。TFS 在這個章節里不是重點,它將出現在稍后的第二節里面。

首先我們將從VS2010開始講起,點擊工具欄里的文件選項,創建新工程。我這里選擇 “WPF 應用程序”,并且給它起名為 PicViewer (這是在新VS Beta 1版本上的對話框):

這樣就為我們生成了一個默認的工程模板,里面包括一個表格窗體,還有默認生成的C#代碼:

一開始,我將拖動窗口把它變大,可以直接在這個設計器里拖拽實際的窗體,或者使用編輯器來設置XAML文件里的width這個屬性。這里暫且讓它的寬度設為700:

在這個應用程序里,我們想通過操作按鈕控件來顯示一個圖片列表中上一個和下一個圖片。并且顯示這個圖片的完整路徑,所以這里還需要一個標簽控件。第一步是添加一行到這個表格中,只需單擊藍色邊框,鼠標點擊下圖中紅色區域里的箭頭處:

當我創建這行的時候,它也同時調整了這頁的XAML文件,就像下面這樣:

我們調整這個第一行的高度到“35” 來替代先前的“29*” 。這里的尺寸并非絕對,也可以以你的感覺來自由修改。

我們想讓WPF為按鈕和標簽布局。因此需要創建一個<StackPanel> 邦定Grid.Row=“0”。這個 StackPanel 默認子項的排列方向是垂直的,因此我們改變它的方向為“Horizontal”(水平)。你可以通過使用XMAL編輯器修改其屬性來實現。最后你應該核對一下是否如下面這個效果:

讓我們從工具箱里拖拽一個按鈕到這行上面:

我想要一個瀏覽上一副圖片的按鈕,我首先要編輯這個屬性窗口里的設置:

修改這個Name字段為“buttonPrev”, 然后修改這個Content 設置為“Prev”。重復這個步驟 拖拽另一個按鈕到這個Prev 按鈕的右邊,然后編輯其Name屬性為“buttonNext” 還有 Content屬性為 “Next”。你可以看到像下面這樣:

這僅僅是實現了功能上面的需求,但是看上去外觀卻不敢恭維。我們可以添加一些空白圍繞在這兩個按鈕周圍。可以通過設置這個margin屬性來實現,這個屬性的作用是,用來控制有多少空格將出現在這個控件項的四周。選擇這個Prev 按鈕,我們就可以設置這個屬性了:

這里我們給這個按鈕的Margin屬性賦值為5 代表四周的間距都是5 (你也可以單獨地給上|下|左|右設置各自的值)。為Next 按鈕做同樣的操作。這時候,你可以看到這個效果:

最后,拖一個標簽到Next 按鈕的右邊并且修改這個標簽的名稱為 “labelPath” ,然后給它的寬度設置為 “400”。當修改完成后,你的 XAML 應該呈現為下面這個樣子 (如果這個文本不正確,你也可以編輯它。):

為了顯示我們的圖片,我們需要在底部添加一個圖片控件。從工具箱中拖一個圖片控件。你可以看到如下圖這樣:

這種情況下,擁有智能標簽這個特性的Forms窗口就顯得很便于操作了。但是這個功能目前只在我們的功能列表中,還沒有集成到WPF 設計器中。因此,我將編輯這個XAML文件,除了Grid.Row,Margin和Name的屬性設置外,刪除所有設計器為圖片控件自動添加的其他屬性設置。你的設置看上去應該像下面這樣。現在這個圖片控件已經部署到表格的底端,而且與表格邊界有適當的間隙:

現在應用程序的外觀已經完成,我們需要添加一些代碼來讓它工作。雙擊Window的標題欄可以創建一個load事件的處理方法。

接著雙擊Prev和Next按鈕,可以得到以下代碼行:

對于這個圖片預覽器,我準備從我的Windows 7 用戶目錄下得到jpg文件列表,并展示它們。我習慣于在Window1.xaml.cs先寫預覽代碼,這樣便于我理解。接著寫它的邏輯實現。起先,我聲明一個還不存在的類的實例。

因為這個類還不存在,所以在這個類型下會有紅色曲線。我們接下來創建這個類。

下一步是在這個文件里完成所有預覽的代碼。我們會從Window_Load()方法開始。注意到盡管這個類還沒有被定義,但在類關鍵字之后智能感知(IntelliSense)會包含這個類型,所以你可以使用它。

我們希望在啟動應用程序的時候,能初始化這個列表并展示第一幅圖片。代碼如下:

因為一些方法還不存在,所以會有錯誤提示,這里先不處理它們。接著換到Prev按鈕的處理方法。當我調用DisplayPicture 方法時,由于它并不存在,你會注意到智能感知(IntelliSense)窗口中沒有這個方法。

如果你按<Ctrl>+<Alt>+空格鍵,你能將模式轉變成“consume first”模式。這種模式下編輯器能在我鍵入方法名時提供這些名字。現在當我開始鍵入時,那個新的(還未聲明的)方法也能在列表中出現,但是智能感知(IntelliSense)不會按照完成列表中的項來自動補全(譯者注:“在譯者的Visual Studio Team Suite2010版本上沒有找到 “consume first”功能。”):

完成后我的代碼如下:

我對這個預覽的基本邏輯很滿意。現在我需要真正的創建這個功能類來找到我的圖片。我們將光標放到PictureList類聲明上并按<Ctrl>+句點鍵(<Ctrl>+.)來展開智能標簽。你會得到下面的彈出項:

選擇第一個菜單項“為‘PictureList’生成類”。這樣一個新文件PictureList.cs會被增加到項目中并且PictureList類會被生成在該文件中。現在類已經被定義了,所以錯誤提示消失了:

接下來你會發現你調用的類的方法都會被顯示為語法錯誤。把光標放在Init()方法上并按<Ctrl>+.,可以得到如下結果:

選取該菜單項可以生成這個方法的代碼。對Peek(),Prev()和Next()方法重復上述步驟。如果我們此時打開Picture.cs文件,你會發現如下代碼已經被生成:

注意到由于我們所寫的如PicList.Peek()這樣的方法需要一個字符串的返回值,編輯器已經自動將這個方法的返回類型定位成字符串類型。

現在我將添加一個獲得Windows安裝中自帶圖片列表的邏輯以便我能遍歷它們:

最后一步是在Windows1.xaml.cs中寫DisplayPicture方法。只需要再次選擇方法名并按<Ctrl>+.,然后填入以下代碼就可以完成該步驟:

這段代碼會獲取jpg文件并將它轉化為BitmapImage類型以便顯示。下一行代碼將我們的XAML圖像控件的Source設置到這個位圖上,這樣它就能被顯示到屏幕上。

現在這個程序已經完成。我將斷點設置在Peek()和DisplayPicture方法上。通過將光標移動到這些方法并按F9鍵就能完成(注意到在空白處的紅色斷點):

現在讓我們按F5鍵來運行這個程序。我們在Peek()方法處遇到了第一個斷點:

你會發現在我們停下的地方的斷點被標記為黃色。此外你會在右下方發現傳統的堆棧調用窗口。因為我使用的是Visual Studio Team System,默認情況下,我會有調試歷史視圖(譯者注:“在譯者的Visual Studio Team Suite2010版本上無此Debug History窗口。”):

默認設置已經捕獲到關于目前我的程序運行情況的相關信息,包括程序所做的所有(由我或由系統引起的)注冊表訪問和系統事件(例如斷點,異常等等)。

如果我把光標放到編輯器中的PicList變量上,我可以得到彈出的觀察窗口。假如我把光標移動到末尾的小方塊上并點擊的話:

你能在編輯器中得到一個粘附數據提示窗口(箭頭僅用來演示結果,在編輯器中并不存在):

這是一個使用新的WPF編輯器的簡單例子。粘附數據提示窗口是WPF對調試器中文本緩沖區的裝飾。通過展開數組內容等等,你可以像使用一般的觀察窗口那樣使用它。

讓我們按F5鍵繼續這個程序。我的應用程序包括Prev和Next按鈕現在都能工作了:

唯一的問題是文件的名稱沒有被更新。再次點擊Next按鈕到DisplayPicture()方法的斷點上。在這個方法中沒有更新標簽的代碼:

我們增加一行新的代碼來修復這個問題:

由于有編輯并繼續的特性,你在應用程序運行時可以做新的代碼修改。更新代碼如下:

現在按F5鍵讓程序繼續,可以看到路徑被更新了:

我還想要做一些完善和收尾工作。讓我們通過增加Stretch=“Fill”來伸展圖片到適合窗體:

接下來我們添加一個長方形作為圖片的邊框:

然后你可以選擇長方形并設置填充屬性來設置顏色。這會調用新的內置調色盤:

我選擇藍/黑色,可以得到如下效果:

最終的XAML完成如下:

這段示例,尚有很多方法可以去改進它,諸如使用數據邦定控件來枚舉 ,給所有的屬性添加異常處理的邏輯等等。但是我此篇主旨在于展示編輯器和設計器的一些新特性,所以我點到即止,將這些作為練習留給大家。

暢享!


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js 日期星期 帶農歷

Weekday代碼 //得到當前日期如2009年6月19日 星期五 function getDate(){ var today new Date(); var x new Array("星期日", "星期一", "星期二","星期三","星期四", "星期五","星期六"…

FMDB的使用

// // FMDBmanager.h // database // // Created by PRL on 16/10/13. // Copyright © 2016年PRL. All rights reserved. // #import <Foundation/Foundation.h> interface FMDBmanager : NSObject{ FMDatabase * _db; } (FMDBmanager *)sharedManager; //獲取…

深入淺出WPF之Binding的使用(一)

from: http://www.cnblogs.com/akwwl/p/3421005.html 在WPF中Binding可以比作數據的橋梁&#xff0c;橋梁的兩端分別是Binding的源&#xff08;Source&#xff09;和目標&#xff08;Target&#xff09;。 一般情況下&#xff0c;Binding源是邏輯層對象&#xff0c;Binding目…

arm處理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依據什么來分類的【轉】

轉自&#xff1a;http://blog.csdn.net/maochengtao/article/details/9951131ARM處理器發展這么多年&#xff0c;有很多架構&#xff0c;很多不同的內核 架構有armv1 v2 v3 v4 v5 v6 v7 內核太多了&#xff0c;比如armv1對應的是arm1&#xff0c;armv5對應的arm9&#xff0c;ar…

前端開發一些很有用的工具

apiview.com 接口規范管理平臺 restClient 谷歌瀏覽器接口測試工具 postman 接口測試工具 SSH Secure Shell Client 抓包工具 SSH SecureFile Transfer Client wireshark 抓包分析工具 Xshell linux遠程工具 Balsamiq Mockups 原型圖 visio 流程圖 xmind top圖 SourceCounter、…

所有的iPhone設備cell的寬度都是320,解決辦法是?

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.frameCGRectMake(0, 0, SW, 44); } return self; } 自己重設一下寬度就行了

深入淺出WPF之Binding的使用(二)

from: http://www.cnblogs.com/akwwl/p/3421250.html 在上一篇中介紹了Binding的基本綁定方法&#xff0c;這一篇中我們在深入的介紹Binding的其他用法。 Binding的源也就是數據的源頭&#xff0c;在日常的工作中&#xff0c;除了使用像上一篇中的Student對象作為數據源外&a…

iOS 推送

最近在研究ios的推送問題&#xff0c;遇到了一些問題&#xff0c;最終整理了一下。放在這里和大家分享APNS的推送機制首先我們看一下蘋果官方給出的對ios推送機制的解釋。如下圖 Provider就是我們自己程序的后臺服務器&#xff0c;APNS是Apple Push Notification Service的縮寫…

Bash判斷文件夾(目錄)是否存在

1 #!/bin/bash 2 if [ -d DirName ]; then 3 echo Dir exist 4 else 5 echo Dir not exist 6 fi 轉載于:https://www.cnblogs.com/imzye/p/5059031.html

iOS 加載本地html文件詳細操作

webView的加載&#xff0c;如果是純文本&#xff0c;有內部樣式的話&#xff0c;簡單的加載請求就可以了。如下: 這種加載簡單直接&#xff0c;易操作。 如果需要加載images&#xff0c;css文件 需要把xcode的項目請求路徑的位置告訴webView.代碼如下&#xff1a; 這樣html文件…

HDU 5573 Binary Tree 構造

Binary Tree題目連接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5573 Description The Old Frog King lives on the root of an infinite tree. According to the law, each node should connect to exactly two nodes on the next level, forming a full binary…

志邦櫥柜坑爹,志邦櫥柜大忽悠,志邦櫥柜欺騙

本人實實在在經歷的&#xff0c;志邦櫥柜就是個大忽悠,志邦櫥柜沒誠信!! 志邦櫥柜先騙客戶下訂單,在預算時低開,到真正簽合同時&#xff0c;不僅僅尺寸坑你,一大堆增項都會出來,原本1.5w預算到最后簽合同總價到2.2w,簽合同增項高開最后志邦櫥柜總價超預算非常非常離譜&#xff…

多線程的那點兒事(之讀寫鎖)

在編寫多線程的時候&#xff0c;有一種情況是十分常見的。那就是&#xff0c;有些公共數據修改的機會比較少。相比較改寫&#xff0c;它們讀的機會反而高的多。通常而言&#xff0c;在讀的過程中&#xff0c;往往伴隨著查找的操作&#xff0c;中間耗時很長。給這種代碼段加鎖&a…

iOS獲取設備IP

獲取iOS設備IP wifi和流量環境下 在網上找的比較好的獲取ip的代碼 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> #define IOS_CELLULAR "pdp_ip0" #define IOS_WIFI "en0" #define IOS_VPN …

一些不錯的網站

http://www.huxiu.com/虎嗅網&#xff0c;一個關注最新創業信息的網站http://36kr.com/創業天花板https://www.zhihu.com/與世界分享你的經驗http://www.mafengwo.cn/世界那么大&#xff0c;想去哪就去那http://www.mt-bbs.com/找到屬于自己的設計本http://www.guokr.com/科技有…

[原]詳解如何將cocos2dx項目編譯到Android平臺上的(方式一:Cywin+NDK)

鏈接地址&#xff1a;http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8閱讀578 評論0 前言&#xff1a;cocos2dx作為一個開源的移動2D游戲框架&#xff0c;其跨平臺的特性讓它備受開發公司的歡迎。這里我就不做概念性的解釋了&#xff0c;通過這篇文章你就會了解…

互斥鎖和讀寫鎖的區別

原文地址&#xff1a;http://blog.csdn.NET/u012884354/article/details/46691761 相交進程之間的關系主要有兩種&#xff0c;同步與互斥。 所謂互斥&#xff0c;是指散布在不同進程之間的若干程序片斷&#xff0c;當某個進程運行其中一個程序片段時&#xff0c;其它進程就不能…

JSP EL表達式使用

為什么80%的碼農都做不了架構師&#xff1f;>>> ##1.EL全名為Expression Language out.print(str) <%str%> ${str}例子&#xff1a; Hi! <%username%> 和 Hi! ${username}是一樣的 只要是支持servlet2.4/jsp2.0的Container就都可以在jsp網頁中直接使用e…

eclipse 中 Android sdk 無法更新的問題

誒&#xff0c;真是麻煩&#xff0c;想下個東西都下不了。我也好久沒折騰過這個了&#xff0c;在家的電腦是早就下載好了的&#xff0c;然后如今又須要下載一份。下不到。網上搜到了資料&#xff0c;記錄下來&#xff1a; 第一種方法:sdk manager - tools - option 選擇強制 xx…

iOS10 xcode8 分頁請求MJRefresh崩潰問題

MJRefresh出現崩潰現象 解決辦法&#xff1a;類庫增加判斷 if (range.location ! NSNotFound) { language [language substringToIndex:range.location]; }