2012-06-17 30 views
10

我可能會錯過WPF設計的基礎知識,但我想知道爲什麼WPF控件的許多屬性都以類型'Object'的形式公開?爲什麼WPF中的許多屬性是「對象」而不是接口?

例如,MenuItem.Icon是一個對象,MenuItem.ToolTip也是如此。作爲接近第一次的用戶,這對我來說非常混亂(感覺就像我在使用動態編程語言,不知道將ToolTip設置爲String類型是否會起作用)。此外,我試圖將圖標設置爲'System.Drawing.Icon',並且我得到ArgumentException的「參數'圖片'必須是可以用作圖標的圖片。」不應該輸入屬性,所以它至少可以描述你應該給它的世界上的東西嗎?

老實說,我對這個原因的猜測是因爲你不能在你沒有創建的類型上實現一個接口(沒有創建包裝),但這只是一個猜測。

非常感謝您的回答和見解!

回答

2

我認爲主要原因是因爲Object是「.Net Framework中所有類的最終基類」。這給了你靈活性,在WPF中,你不限於預定義的類型。 Wpf是不同的,並有一個學習曲線,但它確實給了你更多的選擇來創建一個看起來不錯的產品。

您可以將文本框指定工具提示:

TextBox tb = new TextBox(); 
tb.Text = "Hello World"; 
this.ToolTip = tb; 

位圖

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg"))); 
Image image = new Image(); 
image.Source = myBitmapImage; 
this.ToolTip = image; 

,並分配一個圖像到菜單項

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg"))); 
Image image = new Image(); 
image.Source = myBitmapImage; 
menuItem1.Icon = image; 
+0

我認爲這很酷,但不是對象必須是某種UI元素? TextBox和Image都是FrameworkElements。我所看到的唯一可以分配的不是FrameworkElement是一個String ...是唯一的東西嗎?如果是這樣,它似乎不是一個很好的理由,因爲我可以在我的字符串周圍創建一個標籤或包裝。 – Trevor

+0

@Rovert不,它取決於屬性,如果有一個視覺方面,WPF將其轉換爲圖像的方式,那麼它會顯示。您可以將*任何*分配給對象。我相信這是Xaml標記工作所需的[TypeConversion](http://msdn.microsoft.com/en-us/library/aa970913.aspx)的一個副產品。 –

+0

關於TypeConversion的有趣點。這實際上對於它如何以及如何決定它可以顯示出更多的意義。例如,尋找ImageSource來弄清楚它們如何工作會導致巨大的困惑,但現在我知道必須在幕後進行一些動態行爲。謝謝! – Trevor

1

考慮例如。工具提示是ContentControl,其中可以包含任何類型的CLR(公共語言運行時)對象(如字符串或DateTime對象)或UIElement對象(例如矩形或面板)。這使您可以將豐富的內容添加到Button和CheckBox等控件中。

由於這個原因,ToolTip等元素會暴露爲Object,這是類型層次結構的根源(因此易於使用,代碼的靈活性和清晰度)。

0

想象一下,這些屬性被鍵入爲UIElements(或其他一些WPF特定對象)。如何將對象添加到不是UIElements的控件?

你將不得不提供從WPF對象派生出來的包裝器,這些對象公開你需要的信息。大多數情況下,包裝只會簡單地調用ToString()被包裝的對象。看作你將使用的大多數類型提供了一個足夠好的默認實現ToString()只需調用它而不是讓開發人員爲所有內容編寫包裝都是有意義的。

其次,想象一下,如果它們被鍵入爲某個界面。如果你想傳達這個接口不能做的事情呢?唯一的選擇是(a)開發人員在框架的限制下工作,或者(b)Microsoft更新接口並打破已寫入的所有現有代碼。

另外考慮如果你使用的是像MVVM這樣的模式。當前的設計意味着您的視圖模型可以以任何方式暴露與WPF無關的屬性,最終使您的代碼在不同技術之間更具可重用性。

最後,請記住表示該屬性的對象與WPF呈現該信息的方式之間存在差異。例如。如果使用基本類型,如System.String,WPF將創建一個文本塊並將文本屬性設置爲的結果ToString()。這允許由UI顯示的數據與它們通過UI呈現的信息是呈現之間的非常乾淨的分隔。

舉一個簡單的類,它表示一個菜單項,例如:

public class MenuItem 
{ 
    public string Text { get; set; } 
    public bool IsChecked { get; set; } 
    public bool IsEnabled { get; set; } 
} 

這種類型僅公開數據有關的菜單項,也沒有這方面的信息應該如何呈現的信息。實際上,除了類的名稱(MenuItem)之外,它甚至不是特定於菜單項的,並且相同的數據可以在另一個UI控件中使用,例如選中的列表框,無需進行任何更改。如果該類暴露了WPF特定的用戶界面元素,那麼這些信息需要根據每個不同的用戶界面控件進行調整。

相關問題