2009-09-04 36 views
26

Khi tôi tạo ra một WPF UserControl và cố gắng sử dụng nó, tôi đã nhận lỗi biên dịch sau:Tại sao tôi không thể sử dụng thuộc tính Tên trên UserControl trong cùng một assembly?

Because 'UserControl1' is implemented in the same assembly, you must set the x:Name attribute rather than the Name attribute.

Thông điệp rất rõ ràng về những gì phải làm để sửa chữa nó, nhưng nguyên nhân của nó là gì? Tại sao tôi không thể sử dụng Name tại đây?

Trả lời

29

x: Tên chỉ đơn giản là một cách rõ ràng hơn để nói "Thuộc tính tên trong không gian tên XML cụ thể này". Thực tế là WPF không thể biên dịch nó mà không được đưa ra gợi ý này bởi vì nó trong cùng một assembly chỉ là một hạn chế về cách họ viết trình phân tích cú pháp.

Nếu bạn hỏi tại sao theo cách này, tôi không biết chắc chắn vì tôi không viết nó. Nó có thể có một cái gì đó để làm với nó cần để có thể giải quyết các thuộc tính Tên (đọc: Thuộc tính phụ thuộc) để một cái gì đó cụ thể TRƯỚC KHI xây dựng UserControl1 của bạn, nói cách khác, một catch-22.

7

Khi bắt đầu trình biên dịch XAML được viết để cho phép tạo "cây" đối tượng .net, đã có 101 dự án trong Microsoft sử dụng XAML. Trình biên dịch XAML không biết gì về WPF.

Thuộc tính "Tên" được định nghĩa bởi WPF và không được trình biên dịch XAML biết đến. WPF ánh xạ thuộc tính name giống với “Name TAG” được hỗ trợ bởi trình biên dịch XAML. Chữ “x” trong “x: name” đang nói sử dụng “name” như được định nghĩa bởi lược đồ xAML xml, “Name” nói tìm một thuộc tính được gọi là “name” trên đối tượng đã cho. Xem In WPF, what are the differences between the x:Name and Name attributes? để biết thêm chi tiết.

Trình biên dịch XAML rất hạn chế trong những gì nó có thể thực hiện với điều khiển người dùng mà không phải tải lắp ráp xác định điều khiển người dùng. Vì XAML cần phải được biên dịch trước khi assembly có thể được nạp, trình biên dịch xaml rõ ràng không thể nạp assembly cho một điều khiển được thực hiện trong cùng một assembly. Do đó trình biên dịch XAML thậm chí không biết mục đó là một điều khiển người dùng.

Properties that are defined on a user control (or its parent class) can therefore not be accessed. “Name” is a property that is defined in the parent (or super-parent) of a custom control.

Trình biên dịch XAML có thể chỉ nói “Tên không được định nghĩa là tài sản”; nếu điều đó xảy ra, hãy nghĩ xem có bao nhiêu người sẽ thất bại trong việc kiểm soát tùy chỉnh đơn giản! Do đó trình biên dịch XAML có một trường hợp đặc biệt cung cấp một thông báo lỗi hữu ích hơn, bằng cách "đoán" ý nghĩa của mã. Dự đoán của nó chủ yếu là chính xác.

Bất cứ điều gì ngoài việc điều khiển người dùng đơn giản nhất cần phải được lắp ráp riêng, tuy nhiên điều khiển đơn giản của người dùng rất phổ biến đến mức trường hợp đặc biệt được coi là đáng giá đối với họ.

+2

'Thuộc tính được xác định trên điều khiển người dùng (hoặc lớp cha mẹ của nó) có thể không được truy cập.' - Điều đó không hợp lý với tôi. Thiết lập các thuộc tính khác, được định nghĩa trong lớp cơ sở hoạt động '', vì vậy tôi không hiểu tại sao trình biên dịch không thể thiết lập giá trị của thuộc tính 'Name' WPF trong cùng một cách – nevermind

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