2009-07-02 106 views
11

我正在尋找關於在WPF中使用Canvas與網格面板的意見。 我需要製作具有基本網格佈局的經典輸入表單,其中一些可能內部有小型數據網格,groupboxes,但所有格式均對齊網格佈局。我正在努力爲我的所有表單使用Grid還是Canvas面板。網格給了我很好的結構;我可以更容易地保持對齊控件。我將爲所有窗口創建基類(繼承Window類),所以Visual Studio中的設計器將無用,因爲它具有這種繼承的問題,而使用Grid面板我並不需要設計器,我可以設置窗口SizeToContent,所以一切都會很好。但是對於Canvas,我可以以任何我喜歡的方式定位控件,這僅僅是我在使用Canvas時看到的好處。網格與畫布

我沒有太多的WPF經驗來預測我可以從佈局上的客戶​​請求中得到什麼樣的問題。在網絡表格中,我有時會使用絕對定位表單,以防萬一客戶有一些「特殊」請求,無論是控制像素的高位還是高位等等,每個與高要求客戶合作的人都知道我的意思。

我想看看您的想法,在商業申請表格佈局建設中有哪些優點和缺點?爲什麼一個比另一個好?任何情況下,一個面板不好用,其他不是?一個面板到另一個面板的缺點是什麼?你會用什麼面板?

謝謝

回答

16

畫布主要是用於定製繪圖功能比任何其他更多。網格絕對是可用於自定義佈局的最佳選擇。

+0

我同意CSharperWithJava - 是一般UI佈局更爲實用的元素。 – Giffyguy 2009-07-02 19:12:31

+1

你會想要使用網格或基於面板的佈局。看一下WPF佈局系統的MSDN概述:http://msdn.microsoft.com/en-us/library/ms745058.aspx – rmoore 2009-07-02 19:18:35

+0

這裏有一個教程,讓你開始使用網格佈局: http:// www .wpftutorial.net/GridLayout.html – CodeFusionMobile 2009-07-06 13:57:48

2

肯定地網格似乎是您需要的您的要求。

我會將網格比喻爲html中的表格(當使用得當時非常有用),而Canvas更像是一個div。不同之處在於Grids是HTML中的表格,div和vs Canvas也是如此。

關於網格的話題,花時間來定義RowDefinitions和ColumnDefinitions,而不是在控件上放置margin來正確放置所有東西。如果你不這樣做,你會後悔的。

3

你可以得到相當與電網,列/行跨越,寬,高的實際佈局深度等

在我看來是會更容易做到對各個項目的佈局通過控制行和列大小來實現網格,而不是將所有內容都硬編碼到畫布中。如果他們決定晚些時候決定改變決議,它也會使事情變得更加簡單。

從亞當森的WPF偷跑(第168頁):

模仿帆布配電網 如果離開電網與單個行和列,並設置的Horizo​​ntalAlignment和所有的 VerticalAlignment孩子的價值除了Stretch之外,孩子們會像Canvas一樣添加到 單個單元格中。將Horizo​​ntalAlignment設置爲左和 VerticalAlignment to Top類似於將Canvas.Left和Canvas.Top設置爲0.設置 Horizo​​ntalAlignment爲Right並VerticalAlignment爲Bottom如同設置 Canvas.Right和Canvas.Bottom爲0。此外,爲每個 元素應用保證金值可以給您提供與將Canvas的附加屬性設置爲相同的 值相同的效果。

您還可以通過網格中的控件內容獲得創意,使其具有更精細的佈局控制級別。

畫布對於像對話框那樣很好的東西很少會改變大小,並且只有一些控件,因爲隨着數量的增長,它們會耗費大量時間。

我個人使用網格。把東西放到像素級上可能會多一點點,但在5%的時間內這是值得的,因爲它可以抽象出很多麻煩。當需要動態調整行和列的大小時,GridSplitter也可以輕鬆實現。

0

即使您無法使用VS Designer,仍可以使用XAML可視化設計器來創建/編輯網格內容。

WPF/SL/XAML的主要用戶體驗優勢之一就是類似HTML的「液體」佈局功能。儘管你現在的設計可能不需要它,但它顯然是未來,值得學習如何設計。

檢查羅布Relyea出色的可XAML editors

0

我會去與網格或由專門的網格子類的列表。你是對的觀點繼承。 UWP中的Visual Studio設計器,WPF使用相同的方法名稱爲基礎和子類生成支持代碼。它不會編譯。

由於我是先期的泛型,我們可以回到以前的方法。其中一個是助手類。每個視圖實現IBaseView並且有一個屬性ViewHelperViewHelper<T>。可能需要enum ViewHelperOptions。如果需要,每個ViewHelper都可以使用繼承而不會中斷可視化設計器。這允許在不破壞MVVM模型的情況下使用通用代碼以及特定的視圖代碼。我們稱之爲MVHVM,因爲ViewHelper具有ViewHelper的知識。這進一步將V與VM分離。

全面實施可能需要使用Activator.CreateInstance。另一個考慮因素是由設計者調用的構造函數。你必須將所有「不會運行的會死機」的代碼移動到(例如)Loaded事件中產生的初始化中。或者您可以使用(UWP)的:

if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled) 
{ DoStuffWhichShouldOnlyBeDoneAtRunTime(); }