原創(chuàng)|其它|編輯:郝浩|2012-12-11 16:25:53.000|閱讀 1024 次
概述:在前面的文章中《WPF Elements構(gòu)建超炫儀表盤(pán)(二)》中我們了解了要?jiǎng)?chuàng)建的儀表盤(pán)所包含的哪些模塊,在本文中就來(lái)看看具體的創(chuàng)建步驟。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
相關(guān)鏈接:
在前面的文章中《構(gòu)建超炫儀表盤(pán)(二) - Mindscape WPF Elements使用教程連載》中我們了解了要?jiǎng)?chuàng)建的儀表盤(pán)所包含的哪些模塊,在本文中就來(lái)看看具體的創(chuàng)建步驟。
運(yùn)行VS2010,并且創(chuàng)建一個(gè)新的.NET 4.0 WPF應(yīng)用程序。但是在開(kāi)始之前,需要先添加一些組件,首先創(chuàng)建一個(gè)新的文件夾并命名為L(zhǎng)ib,然后添加Caliburn.Micro.dll、System.Windows.Interactivity.dll 、the Microsoft.Windows.Shell.dll文件到這個(gè)文件夾下面;接下來(lái),就是添加這些引用到你的項(xiàng)目中去,所以我們?cè)谶@里將需要添加一個(gè)引用到System.ComponentModel.Composition ,這個(gè)會(huì)在稍后用到;當(dāng)你在下載Caliburn.Micro.dll時(shí)就會(huì)有剛才在前文中提到的前面兩個(gè)dll文件,因?yàn)镃aliburn.Micro.dll將為我們處理窗口創(chuàng)建,主要用于創(chuàng)建自定義窗口chrome,完成設(shè)置之后你可以刪除主要的窗口,想要?jiǎng)h除這個(gè),還需要從xaml刪除StartupUri 。
就像在前面的文中提到的那樣,所有控件的主要數(shù)據(jù)來(lái)源來(lái)自一個(gè)訂單列表,所以需要?jiǎng)?chuàng)建一個(gè)名為“模型”的文件夾,然后添加一個(gè)類來(lái)表示一個(gè)訂單,同時(shí)這個(gè)訂單里存儲(chǔ)著客戶名稱、購(gòu)買的產(chǎn)品類型、購(gòu)買日期、采購(gòu)的成本和部門(mén)、客戶來(lái)自哪個(gè)國(guó)家。當(dāng)然如何存儲(chǔ)這些值是由你決定,產(chǎn)品類型例如可以是一個(gè)字符串或是其他,另一個(gè)模型對(duì)象將持有該產(chǎn)品的更多信息,Order類應(yīng)該公開(kāi)這些以綁定到視圖中的值與屬性。
現(xiàn)在我們添加此可視化模型的視圖,這個(gè)將是我們稱之為DashboardView的用戶控件,Caliburn Micro使用命名約定來(lái)找到一個(gè)可視化模型的視圖,這個(gè)模型名稱應(yīng)以“ViewModel”結(jié)束。用戶控件的名稱以“View”結(jié)尾,他們都以一樣的名稱開(kāi)始,在這個(gè)示例中是“Dashboard”。當(dāng)遵循MVVM 模式時(shí),為了不在后面的代碼中編寫(xiě)任何的代碼,所以刪除了DashboardView.xaml.cs 文件。
為了將Caliburn Micro插入到應(yīng)用程序中,需要引導(dǎo)程序,所以向項(xiàng)目中添加一個(gè)新的DashboardBootstrapper 類和擴(kuò)展的Caliburn Micro引導(dǎo)程序。
public class DashboardBootstrapper : Bootstrapper<DashboardViewModel> { }
傳統(tǒng)的引導(dǎo)應(yīng)用程序會(huì)告知Caliburn Micro哪個(gè)模型將會(huì)在應(yīng)用程序啟動(dòng)時(shí)使用,這就是我們現(xiàn)在所需要做的引導(dǎo)程序,我們很快就會(huì)回到這來(lái)集成一個(gè)自定義的窗口管理器。下面就是添加一個(gè)實(shí)例的啟動(dòng)加載器到App.xaml:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:DashboardBootstrapper x:Key="bootstrapper" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
現(xiàn)在應(yīng)用程序可以使用Caliburn Micro提供的所有東西,這時(shí)運(yùn)行應(yīng)用程序,將會(huì)顯示一個(gè)微小的空白窗口。
Caliburn Micro管理著窗口的創(chuàng)建以及關(guān)聯(lián)到合適的視圖模型,但是有的時(shí)候,你想控制一些窗口的屬性,窗口管理器就是用在這些地方,添加一個(gè)新類到DashboardWindowManager項(xiàng)目,延長(zhǎng)Caliburn Micro indowManager類,在這里你可以覆蓋EnsureWindow方法,調(diào)用基本實(shí)現(xiàn),然后在返回的窗口設(shè)置任何的屬性。我已經(jīng)手動(dòng)設(shè)置SizeToContent來(lái)實(shí)現(xiàn)WindowState來(lái)最大化,接下來(lái),回到你的啟動(dòng)加載器然后像這樣進(jìn)行編輯:
public class DashboardBootstrapper : Bootstrapper<DashboardViewModel> { private CompositionContainer container; protected override void Configure() { container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>())); CompositionBatch batch = new CompositionBatch(); batch.AddExportedValue<IWindowManager>(new DashboardWindowManager()); batch.AddExportedValue<IEventAggregator>(new EventAggregator()); batch.AddExportedValue(container); container.Compose(batch); } protected override object GetInstance(Type serviceType, string key) { string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key; var exports = container.GetExportedValues<object>(contract); if (exports.Count() > 0) { return exports.First(); } throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract)); } protected override IEnumerable<object> GetAllInstances(Type serviceType) { return container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType)); } protected override void BuildUp(object instance) { container.SatisfyImportsOnce(instance); } }
里面所看見(jiàn)的大部分是伴隨著Caliburn Micro一起帶過(guò)來(lái)的,在這里重要的是如何添加儀表的自定義模版的窗口管理器到配置方法中,在這個(gè)過(guò)程中不要忘記了引導(dǎo)程序的更改,的添加一個(gè)導(dǎo)出屬性到DashboardViewModel類,像下面這樣:
[Export(typeof(DashboardViewModel))]
回到儀表管理窗口管理器,我們可以做其他一些有用的東西比如設(shè)置應(yīng)用程序圖標(biāo)并應(yīng)用自定義窗口chrome,這些可能是你要添加到一個(gè)應(yīng)用程序中的一些,但是關(guān)于窗口管理區(qū)這個(gè)主題,現(xiàn)在是提到的好時(shí)機(jī),可以向項(xiàng)目中添加一個(gè)圖標(biāo)文件,然后再使用BitmapFrame。
創(chuàng)建窗口的圖標(biāo)屬性進(jìn)行設(shè)置,對(duì)于自定義窗口,可以使用Microsoft.Windows.Shell dll文件,在App.xaml中,我創(chuàng)建了窗口的風(fēng)格,然后我發(fā)現(xiàn)在窗口管理器找到之后用到了應(yīng)用窗口中,此外還需要附加一些事件處理程序,可以使用下面的代碼實(shí)現(xiàn)。下面就是窗口管理器的最終程序:
public class DashboardWindowManager : WindowManager { private Window _window; protected override Window EnsureWindow(object model, object view, bool isDialog) { _window = base.EnsureWindow(model, view, isDialog); _window.SizeToContent = SizeToContent.Manual; _window.WindowState = WindowState.Maximized; _window.Style = _window.FindResource("CustomWindowStyle") as Style; Uri icon = new Uri("../../WpfElements.ico", UriKind.Relative); _window.Icon = BitmapFrame.Create(icon); _window.CommandBindings.Add(new CommandBinding(SystemCommands.CloseWindowCommand, OnSystemCommandCloseWindow)); _window.CommandBindings.Add(new CommandBinding(SystemCommands.MinimizeWindowCommand, OnSystemCommandMinimizeWindow)); _window.CommandBindings.Add(new CommandBinding(SystemCommands.MaximizeWindowCommand, OnSystemCommandMaximizeWindow)); _window.CommandBindings.Add(new CommandBinding(SystemCommands.RestoreWindowCommand, OnSystemCommandRestoreWindow)); return _window; } private void OnSystemCommandCloseWindow(object sender, ExecutedRoutedEventArgs e) { SystemCommands.CloseWindow(_window); } private void OnSystemCommandMinimizeWindow(object sender, ExecutedRoutedEventArgs e) { SystemCommands.MinimizeWindow(_window); } private void OnSystemCommandMaximizeWindow(object sender, ExecutedRoutedEventArgs e) { SystemCommands.MaximizeWindow(_window); } private void OnSystemCommandRestoreWindow(object sender, ExecutedRoutedEventArgs e) { SystemCommands.RestoreWindow(_window); } }
最后在DashboardView.xaml中,可以得到粗略的儀表盤(pán)了,在下一課中,將會(huì)講到控件的布局來(lái)優(yōu)化儀表效果。在本次的內(nèi)容中,添加了應(yīng)用程序的特定資源到App.xaml中。在大型的應(yīng)用程序中,你可以添加類似這樣的資源到一個(gè)或值多個(gè)庫(kù)中。在這篇文章的最后,我將在每個(gè)控件后添加一個(gè)彩色的矩形,小效果如下:
在稍后的文章中,我將會(huì)演示添加屬性到可視化模型中去,然后將它們放到視圖中的控件中去,還將設(shè)置從視圖返回到視圖模型的設(shè)置,實(shí)現(xiàn)一個(gè)全功能的儀表應(yīng)用程序。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件