2012-06-12 30 views
9

Tôi đã tạo một Ứng dụng chia nhỏ Metro mới trong C++ sử dụng VS2012 trên Win8 (cả RC). Tất cả mọi thứ được biên dịch và làm việc ra khỏi hộp. Sau đó tôi đã thay đổi và thay đổi các không gian tên được tạo thành của riêng mình. Sau một số thử thách và khổ nạn, tôi có mọi thứ để biên dịch mà không có cảnh báo, lỗi, cũng như thông điệp. Ứng dụng (như trong mẫu dự án) chạy tốt.XAML không thể tìm thấy tham chiếu trong không gian tên cục bộ

Tuy nhiên, nếu tôi cố gắng chỉnh sửa một trong các tập tin được tạo XAML (ItemsPage.xaml hoặc SplitPage.xaml) tôi nhận được một "lỗi Markup" trên dòng đầu tiên:

Cái tên "LayoutAwarePage" không tồn tại trong không gian tên "using: ABProduct.Client.Common".

Định nghĩa của lớp là:

namespace A{ namespace B { namespace Product { namespace Client { namespace Common 

mã biên dịch tốt, và chạy tốt. Điều này chỉ xảy ra ở chế độ thiết kế.

CẬP NHẬT: Tôi đã thêm tệp xaml mới và (sau khi sửa các không gian tên một lần nữa) mọi thứ đã hoạt động.

Vui lòng cho tôi biết nếu có bất kỳ thông tin bổ sung nào là cần thiết.

+1

Tên tệp .winmd do dự án của bạn tạo ra là gì? Tên của tệp .winmd phải là tiền tố của tên không gian tên. Vì vậy, đối với không gian tên đó, .winmd phải được đặt tên là A.winmd, A.B.winmd, A.B.Product.winmd, A.B.Product.Client.winmd, hoặc A.B.Product.Client.Common.winmd. Yêu cầu này được áp đặt bởi thời gian chạy cho các loại công khai trong các thành phần (dll). Tuy nhiên, các nhà thiết kế kết thúc tải exe của bạn như là một dll, vì vậy nếu bạn muốn sử dụng các nhà thiết kế, các lớp học của bạn phải phù hợp với cùng một yêu cầu đặt tên trong các dự án ứng dụng là tốt. –

+0

[Nếu điều đó không hữu ích, vui lòng cho tôi biết và tôi có thể giúp điều tra.] –

+0

Tuyệt vời! Tệp WinMD chỉ đơn giản là Client.winmd. Tôi dỡ bỏ dự án, thay đổi không gian tên gốc thành A.B.Product.Client, sau đó tải lại và xây dựng lại dự án. Tệp WinMD giờ đây được gọi là A.B.Product.Client và XAML tải chính xác. Đó chắc chắn là câu trả lời. Nếu bạn muốn thêm bình luận của mình làm câu trả lời, tôi sẽ đánh dấu nó. – basilard99

Trả lời

6

Tên của tệp WinMD do dự án của bạn tạo ra phải là một số tiền tố của các không gian tên trong đó các kiểu WinRT công khai được định nghĩa. Cho rằng kiểu của bạn là trong không gian tên A.B.Product.Client.Common, file WinMD phải có một trong những cái tên sau đây:

A.winmd 
A.B.winmd 
A.B.Product.winmd 
A.B.Product.Client.winmd 
A.B.Product.Client.Common.winmd 

Các loại nào cũng phải được xác định trong tập tin với các tiền tố dài nhất phù hợp với không gian tên WinMD. Vì vậy, nếu bạn có cả hai A.winmdA.B.winmd, loại A.B.MyClass phải được xác định trong A.B.winmd.

Vì vậy, tại sao mã của bạn hoạt động trong thời gian chạy nhưng không hoạt động trong nhà thiết kế? Các quy tắc đặt tên cho các kiểu công cộng chỉ áp dụng cho các kiểu được định nghĩa trong các thành phần Windows Runtime (đối với C++, các tệp DLL), không áp dụng cho các ứng dụng (EXE).

Tuy nhiên, để có thể khởi tạo các loại do người dùng xác định (bao gồm LayoutAwarePage), nhà thiết kế sẽ tải EXE của dự án của bạn dưới dạng DLL, vì vậy phải tuân theo quy tắc đặt tên.

+0

Tôi cũng tìm thấy (ví dụ:khi di chuyển một lớp mô hình khung nhìn đến một không gian tên khác), tôi phải đóng cửa sổ thiết kế, xây dựng và mở lại cửa sổ để thành phần được nạp lại thành công bởi nhà thiết kế. – camflint

+0

@ cflint07: Không được yêu cầu đóng và mở lại nhà thiết kế; nó sẽ tự động tải lại ngay sau khi quá trình xây dựng hoàn tất. Nếu điều đó không xảy ra, hãy xem xét việc mở một lỗi trên [Microsoft Connect] (http://connect.microsoft.com/VisualStudio). –

3

Tôi đã có lỗi tương tự, nhưng sau đó tôi đã đóng VS, đã xóa .suo và tải lại dự án và mọi thứ hoạt động tốt.

+0

Wow nó đã hoạt động! Cảm ơn!! –

+1

Vấn đề với việc này là phần mềm có thể không vượt qua quá trình chứng nhận cửa hàng. Vì vậy, đây chỉ là giải pháp tạm thời. – Julius

+0

Tôi thấy, tôi nghĩ rằng tôi sẽ chỉ cần tạo lại tệp .suo. :) –

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