2012-06-23 40 views
19

sự khác biệt giữa là gìkhi nào nên sử dụng {x: Type…}?</p> <pre><code><Style TargetType="{x:Type Border}"> </code></pre> <p>và::

<Style TargetType="Border"> 

Khi nào và tại sao tôi cần phải sử dụng {x:Type …}?

+1

+1 câu hỏi hay. Tôi đoán là thứ hai là một ký hiệu mới, được cải thiện. – McGarnagle

+3

câu hỏi SO cũ tương tự - http://stackoverflow.com/questions/1085730/difference-between-targettype-controltype-and-targettype-xtype-controltype/9128422#9128422 và http://stackoverflow.com/questions/ 5449481/performance-diff-between-target-sometype-và-target-xtype-sometype/9127377 # 9127377 – akjoshi

Trả lời

11

Không có sự khác biệt nào có hiệu lực; trong cả hai trường hợp tài sản TargetType sẽ được thiết lập để typeof(Border)

Phiên bản đầu tiên {x:Type Border} là cần thiết trong phiên bản đầu tiên của WPF vì trình biên dịch không sử dụng lớp TypeConverter để chuyển đổi chuỗi thành một đối tượng Loại và bạn cần phải xác định TypeExtension lớp học để làm điều đó cho bạn.

Phiên bản thứ hai được giới thiệu, nếu tôi nhớ chính xác, với Silverlight và nhanh chóng tìm thấy cách của nó đến trình biên dịch WPF.

EDIT

giả định của tôi trên lớp TypeConverter đã sai; này được thực hiện bởi các FrameworkElementFactory:

Từ the documentation:

Loại Thuộc tính có hỗ trợ typename-như-String

WPF hỗ trợ kỹ thuật cho phép xác định giá trị của một số tính chất của loại Loại mà không yêu cầu phần mở rộng đánh dấu x: Loại cách sử dụng. Thay vào đó, bạn có thể chỉ định giá trị dưới dạng chuỗi có tên là loại . Ví dụ về điều này là ControlTemplate.TargetType và Style.TargetType. Hỗ trợ cho hành vi này không được cung cấp qua cả trình chuyển đổi loại hoặc tiện ích mở rộng đánh dấu. Thay vào đó, đây là hành vi trì hoãn được triển khai thông qua FrameworkElementFactory.

Silverlight hỗ trợ quy ước tương tự. Trên thực tế, Silverlight hiện không hỗ trợ {x: Type} trong hỗ trợ ngôn ngữ XAML của nó và không chấp nhận {x: Type} sử dụng bên ngoài một số trường hợp là nhằm hỗ trợ di chuyển WPF-Silverlight XAML. Do đó, hành vi kiểu tên-như-chuỗi được tích hợp cho tất cả các đánh giá thuộc tính gốc của Silverlight trong đó Loại là giá trị.

1

Cả hai đều giống nhau. Trong cả hai trường hợp, kiểu của bạn sẽ chỉ áp dụng cho Border.

2

Đặt thuộc tính này (TargetType) thành Đường viền mà không gán kiểu với x:Key cho phép kiểu được áp dụng cho tất cả các phần tử Đường viền. Nhưng khi bạn đặt x:Key thành {x:Type Border}, Điều này có nghĩa là nếu bạn cung cấp cho giá trị x:Key của bất kỳ thứ gì khác ngoài {x:Type Border}, thì Style sẽ không được áp dụng cho tất cả các phần tử Biên giới một cách tự động. Thay vào đó, bạn cần áp dụng kiểu dáng cho các phần tử Border một cách rõ ràng.

4

Mặc dù trong ví dụ cụ thể, nó không có sự khác biệt nhưng thực sự có sự khác biệt giữa x:TypeTypeName-as-String.

Gần đây tôi đã gặp phải một tình huống trong đó cho thấy rằng x:Type là khác nhau từ TypeName-as-String khi nói đến loại tùy chỉnh. Từ kinh nghiệm của tôi -

x:Type coi tên mạnh hoặc các phiên bản của hội đồng (trong đó loại cư trú) nhưng không TypeName-as-String.

tôi đã giới thiệu về kịch bản của tôi và các chi tiết khác trong blog của tôi ở đây -

Importance of specifying AncestorType with x:Type in RelativeSourceBinding

Ngoài ra, đó cũng là sự khác biệt trong cách suy luận WPF loại. Đối với x:TypeTypeExtension được sử dụng, trong khi đối với TypeName-as-StringFrameworkElementFactory được sử dụng (như Erno đã đề cập).

0

Nếu bạn đang sử dụng XAML 2009, x: Khóa có thể được chỉ định làm phần tử, để hỗ trợ rõ ràng từ điển được khóa theo loại đối tượng ngoài chuỗi mà không yêu cầu tiện ích đánh dấu trung gian. Xem phần "XAML 2009" trong chủ đề này. Phần còn lại của phần Ghi chú áp dụng riêng cho triển khai XAML 2006.

Giá trị thuộc tính của x: Khóa có thể là bất kỳ chuỗi nào được xác định trong Ngữ pháp XamlName hoặc có thể là đối tượng được đánh giá thông qua tiện ích mở rộng đánh dấu. Xem "Ghi chú sử dụng WPF" cho một ví dụ từ WPF.

Phần tử con của phần tử gốc là triển khai IDictionary thường phải bao gồm thuộc tính khóa x: chỉ định giá trị khóa duy nhất trong từ điển đó. Khung có thể thực hiện các thuộc tính khóa bí danh để thay thế cho x: Khóa trên các loại cụ thể; các kiểu xác định các thuộc tính như vậy phải được gán với DictionaryKeyPropertyAttribute.

Mã tương đương với chỉ định x: Khóa là khóa được sử dụng cho IDictionary cơ bản. Ví dụ, một x: Key được áp dụng trong đánh dấu cho một tài nguyên trong WPF tương đương với giá trị của tham số quan trọng của ResourceDictionary.Add khi bạn thêm tài nguyên vào một ResourceFictionary WPF trong mã. Phần mở rộng đánh dấu x: Type có chức năng tương tự với toán tử typeof() trong C# hoặc toán tử GetType trong Microsoft Visual Basic.

Tiện ích đánh dấu x: Loại cung cấp hành vi chuyển đổi từ chuỗi cho các thuộc tính có loại Loại. Đầu vào là kiểu XAML. Mối quan hệ giữa kiểu XAML đầu vào và kiểu CLR đầu ra là kiểu đầu ra là lớp UnderlyingType của đầu vào XamlType, sau khi tra cứu XamlType cần thiết dựa trên bối cảnh lược đồ XAML và dịch vụ IXamlTypeResolver mà bối cảnh cung cấp.

Trong dịch vụ .NET Framework XAML, việc xử lý cho tiện ích mở rộng đánh dấu này được xác định bởi lớp TypeExtension.

Trong triển khai khung cụ thể, một số thuộc tính lấy loại dưới dạng giá trị có thể chấp nhận tên của loại trực tiếp (giá trị chuỗi của tên loại). Tuy nhiên, việc thực hiện hành vi này là một kịch bản phức tạp. Ví dụ, xem phần "Ghi chú sử dụng WPF" sau.

Cú pháp thuộc tính là cú pháp phổ biến nhất được sử dụng với tiện ích mở rộng đánh dấu này. Mã thông báo chuỗi được cung cấp sau khi chuỗi định danh x: Type được gán làm giá trị TypeName của lớp mở rộng TypeExtension cơ bản. Theo ngữ cảnh XAML mặc định cho .NET Framework XAML Services, dựa trên kiểu CLR, giá trị của thuộc tính này là Tên của kiểu mong muốn, hoặc chứa Tên đó trước tiền tố cho một ánh xạ không gian tên XAML không mặc định .

Tiện ích đánh dấu x: Loại có thể được sử dụng trong cú pháp phần tử đối tượng. Trong trường hợp này, chỉ định giá trị của thuộc tính TypeName là bắt buộc để khởi tạo đúng tiện ích mở rộng.

Tiện ích đánh dấu x: Loại cũng có thể được sử dụng làm thuộc tính tiết; tuy nhiên, việc sử dụng này không điển hình:

+4

Nếu bạn sao chép bài kiểm tra, bạn nên cung cấp liên kết và/hoặc cho tín dụng. –

+0

Ctrl + C, Ctrl + V được phát hiện :) –

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