2012-02-29 86 views
14

最近我發現WPF在XAML中支持不同的度量單位。除了默認的DIP,還支持像素,英寸和釐米(據我所知)。這允許設計者編寫如下的XAML:WPF單元和代碼隱藏

<Canvas> 
    <Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/> 
</Canvas> 

但是,您無法綁定這些值。想象一下,我們有一個Dimension屬性的ViewModel,它是一個字符串,例如「7cm」。以下將不起作用:

<Button Width="{Binding Dimension}">Test</Button> 

FormatException被拋出。同樣,在代碼中創建隱藏一個FrameworkElement,像這樣的時候:因爲異常在構造函數拋出/無論你嘗試創建控制

Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"}); 

編譯失敗。

我在想:

  • 是否可以使用自然單位(在我的情況的度量 - 釐米)的代碼隱藏?
  • 如何?
  • 是否有完整的單元列表WPF/XAML支持?

編輯:

這裏是從下面的評論的鏈接,從而解決了這個問題:

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx

回答

13

您可以在代碼中做到這一點的背後通過採用XAML解析器使用相同的轉換,則不需要重新實現這個邏輯,如果你不介意身邊掠過字符串:

button.Width = (double)new LengthConverter().ConvertFrom("2cm"); 

的XAML解析器使用TypeConverters將字符串轉換爲所需要的值,在documentation page of the Width property你可以看到它有一個TypeConverterAttribute指定一個LengthConverter應該被使用。這個屬性可以用來本地覆蓋應該如何處理一個屬性,但是它也可以在類級應用,所以如果一個Employee類有這個屬性指定應該使用EmployeeConverter,那麼所述轉換器將是類型屬性的默認值Employee

我有點驚訝綁定不應用此類型轉換器,但使用它的IValueConverter裏面也非常簡單,其實你可以創建一個markup extension從一個類型轉換器構造一個IValueConverter,使其很好地通用。

+0

這就是我一直在尋找的,謝謝! – 2012-03-01 00:52:27

+0

不客氣,很高興幫助:) – 2012-03-01 00:53:47

2

對於1)和2)由於DIP封裝是設備無關的,可以計算任何「自然單位」來回沒有問題。例外是(非自然:)設備相關像素。

創建一個ValueConverter,將字符串值轉換爲雙倍字符串,您可以在字符串中指定所需的單位。然後,您可以在Binding中使用ValueConverter,並在ViewModel中以「自然單位」進行計算。對於3)和執行:我已經快速搜索並沒有發現任何東西,但也許會進行更深入的搜索顯示的東西。否則,創建你自己的轉換器應該不是很困難。這裏是一些轉換的相關信息:

96DIP == 1inch == 2.54cm; 
1cm == 37.8DIP; 
1zoll == 1inch == 2.54cm; 
+0

我付出轉換器可能是一種方式去。但是在我編寫我自己的之前,你認爲有一種方法可以確定Converter XAML分析器使用的是什麼?我認爲WPF中必須有一個內置的轉換器,因爲XAML支持這個單元。所以我會主張使用內置的,我只是無法確定一個確定它是哪一個的方法。可能有些堆棧跟蹤調查?我真的不知道,有什麼想法嗎? :) – 2012-02-29 18:51:17

+1

@Aaron:我也喜歡使用現有的元素,但是對於我詢問的每個轉換器,我很快找到了類名。但在這個特定的情況下,谷歌沒有什麼可說的。爲了檢測wpf中使用的轉換器,我忍不住。我從來沒有深入瞭解FCL。也許這值得一個專門的問題:如何跟蹤哪些ValueConverter被WPF用於特定的轉換? – HCL 2012-02-29 18:56:35

+0

感謝您的回答。我會嘗試自己設計一個正確的Converter,如果失敗,可能會問一個新問題。再次感謝! – 2012-02-29 18:59:49