Dưới đây tôi mô tả cách tạo lại lỗi mà tôi nhận được. Nó hoạt động tương tự trong VS 2010, 2012, và 2013. Chia nó thành nhiều dự án, như tôi chỉ ra dưới đây, là quan trọng.Vụ va chạm không gian tên này có phải do lỗi trong quá trình tạo mã XAML đến .NET không?
bước để sao chép các lỗi:
Tạo một giải pháp.
Tạo một thư viện C# lớp được gọi là Common, chứa một tập tin có tên Handler.cs:
using System; namespace Common { public delegate void Handler(object sender, EventArgs args); }
Tạo một dự án WPF thư viện điều khiển người dùng gọi MyControlLibrary, tham khảo chung. Trong đó, tạo một điều khiển người dùng được gọi là MyControl.xaml.
MyControl.xaml:
<UserControl x:Class="ControlNamespace.MyControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> </Grid> </UserControl>
MyControl.xaml.cs:
using System.Windows.Controls; using Common; namespace ControlNamespace { public partial class MyControl : UserControl { public MyControl() { InitializeComponent(); } public event Handler MyEvent; } }
Tạo một dự án WPF Application gọi MyWpfApplication, tham khảo chung và MyControlLibrary. Trong đó, tạo WindowNamespace.Common.cs cũng như một cửa sổ có tên MyWindow.xaml.
WindowNamespace.Common.cs:
namespace WindowNamespace.Common { }
MyWindow.xaml:
<Window x:Class="WindowNamespace.MyWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:ControlNamespace;assembly=WpfControlLibrary1" Title="MyWindow" Height="300" Width="300"> <Grid> <c:MyControl MyEvent="MyControl_MyEvent" /> </Grid> </Window>
MyWindow.xaml.cs:
using System; using System.Windows; namespace WindowNamespace { public partial class MyWindow : Window { public MyWindow() { InitializeComponent(); } void MyControl_MyEvent(object sender, EventArgs args) { } } }
Xây dựng giải pháp.
Bạn sẽ nhận được lỗi sau, trỏ đến dòng 7 của MyWindow.xaml:
The type or namespace name 'Handler' does not exist in the namespace 'WindowNamespace.Common' (are you missing an assembly reference?)
Nếu bạn mở .gics tập tin tạo ra cho MyWindow.xaml, bạn sẽ thấy những điều sau đây phương pháp IComponentConnector.Connect:
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Common.Handler(this.MyControl_MyEvent);
Nguồn của vấn đề là cố gắng tìm Common.Handler trong WindowNamespace. Điều này có thể được giải quyết bằng cách sau khi nó được tạo ra như:
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new global::Common.Handler(this.MyControl_MyEvent);
Hoặc bằng cách thêm một sử dụng để phía trên cùng của file:
using Common;
...
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Handler(this.MyControl_MyEvent);
Lưu ý rằng nếu tất cả những tập tin nguồn được đóng gói vào một dự án duy nhất, lỗi này biến mất, bởi vì tệp .gics được tạo khác nhau (nghĩa là nó không thêm trình xử lý vào sự kiện một cách rõ ràng).
Đây có phải là lỗi trong bản dịch XAML -> NET hay là có điều gì đó mà tôi đang làm sai?
Cảm ơn bạn đã nỗ lực tái tạo sự cố này. Tệ quá, chưa có giải pháp nào. Dường như một số không gian tên ** clr: ... ** điều chỉnh để cho phép ** toàn cầu: ** trong không gian tên sẽ khắc phục sự cố. –