2012-02-29 41 views
14

Gần đây tôi đã phát hiện ra WPF hỗ trợ các đơn vị đo lường khác nhau trong XAML. Bên cạnh các DIP mặc định, cũng có hỗ trợ cho pixel, inch và cm (theo như tôi biết). Điều này cho phép nhà thiết kế viết XAML như sau:Các đơn vị WPF và Mã số Đằng sau

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

Tuy nhiên, bạn không thể ràng buộc các giá trị này. Hãy tưởng tượng chúng ta có một ViewModel với thuộc tính Dimension là một String, ví dụ "7cm". Theo dõi sẽ không hoạt động:

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

FormatException bị ném. Tương tự như vậy, khi tạo một FrameworkElement trong code-behind, như thế này:

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

Compilation thất bại vì ngoại lệ được ném vào xây dựng/bất cứ nơi nào bạn cố gắng tạo ra sự kiểm soát.

Tôi tự hỏi:

  • Có thể sử dụng các đơn vị tự nhiên (trong trường hợp số liệu của tôi - cm) trong code-behind?
  • Làm cách nào?
  • Có danh sách đầy đủ các đơn vị mà WPF/XAML hỗ trợ không?

EDIT:

Dưới đây là một liên kết từ bình luận dưới đây, trong đó giải quyết câu hỏi này:

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

Trả lời

13

Bạn có thể làm điều này trong mã đằng sau bằng cách áp dụng cùng một chuyển đổi các XAML-phân tích cú pháp sử dụng, bạn không cần phải reimplement logic này nếu bạn không nhớ đi xung quanh chuỗi:

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

các XAML-phân tích cú pháp sử dụng TypeConverters để chuyển đổi chuỗi các giá trị cần thiết, trong documentation page of the Width property bạn có thể thấy rằng nó có một TypeConverterAttribute xác định rằng một LengthConverter nên được sử dụng. Thuộc tính này có thể được sử dụng để ghi đè cục bộ cách xử lý thuộc tính, nhưng nó cũng có thể được áp dụng ở cấp lớp, vì vậy nếu một lớp Employee có thuộc tính này chỉ định rằng EmployeeConverter nên được sử dụng, bộ chuyển đổi sẽ là mặc định cho thuộc tính loại Employee.

Tôi là một chút ngạc nhiên các ràng buộc không áp dụng kiểu chuyển đổi này, nhưng sử dụng nó bên trong một IValueConverter sẽ đủ đơn giản, trên thực tế bạn có thể tạo một markup extension mà xây dựng một IValueConverter từ bộ chuyển đổi loại để làm cho nó độc đáo generic.

+0

Đây là những gì tôi đang tìm kiếm, cảm ơn bạn! –

+0

Bạn được chào đón, vui mừng được trợ giúp :) –

2

Đối với 1) và 2) Bởi vì DIPs là thiết bị độc lập, bạn có thể tính toán bất kỳ "đơn vị tự nhiên" đến và đi mà không có vấn đề. Ngoại lệ là các pixel phụ thuộc thiết bị (không tự nhiên :).

Tạo ValueConverter chuyển đổi giá trị chuỗi thành gấp đôi nơi đơn vị mong muốn của bạn có thể được chỉ định trong chuỗi. Sau đó, bạn có thể sử dụng ValueConverter trong Binding của bạn và tính toán trong ViewModel của bạn trong "đơn vị tự nhiên".

Đối với 3) và triển khai: Tôi đã nhanh chóng googled và không tìm thấy gì, nhưng có thể sẽ tìm kiếm sâu hơn hiển thị nội dung nào đó. Nếu không, việc tạo công cụ chuyển đổi của riêng bạn sẽ không quá khó khăn. Dưới đây một số infos chuyển đổi:

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

Tôi nghĩ Chuyển đổi có thể là một cách để đi. Nhưng trước khi tôi viết rất riêng của tôi, bạn có nghĩ rằng có một cách để xác định những gì chuyển đổi XAML phân tích cú pháp sử dụng? Tôi nghĩ rằng phải có một bộ chuyển đổi tích hợp sẵn trong WPF, vì XAML hỗ trợ các đơn vị này. Vì vậy, tôi muốn sử dụng một trong những built-in, tôi chỉ không thể tìm ra một cách để xác định đó là một trong những. Một số điều tra vết vết có thể? Tôi không thực sự biết, bất kỳ ý tưởng, xin vui lòng? :) –

+1

@Aaron: Tôi cũng thích sử dụng các phần tử hiện có, tuy nhiên đối với mỗi trình chuyển đổi tôi hỏi google, tôi đã nhanh chóng tìm thấy tên lớp. Nhưng trong trường hợp cụ thể này, google không có gì để nói. Để phát hiện bộ chuyển đổi được sử dụng trong wpf, tôi không thể trợ giúp. Tôi chưa bao giờ đào sâu hơn vào FCL. Có lẽ đây là một câu hỏi dành riêng: Làm thế nào để theo dõi ValueConverter nào được WPF sử dụng cho một chuyển đổi cụ thể? – HCL

+0

Cảm ơn câu trả lời của bạn. Tôi sẽ cố gắng tìm một Trình chuyển đổi phù hợp theo cách riêng của mình và có thể hỏi một câu hỏi mới nếu tôi thất bại. Cảm ơn một lần nữa! –

Các vấn đề liên quan