2013-12-13 26 views
6

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:

  1. Tạo một giải pháp.

  2. 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); 
    } 
    
  3. 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; 
        } 
    } 
    
  4. 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) 
         { 
         } 
        } 
    } 
    
  5. 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?

+0

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ố. –

Trả lời

0

Có một đầu mối như những gì đang xảy ra nếu bạn redeclare các đại biểu Handler trong khai namespace WindowNamespace.Common của bạn trong MyWpfApplication và thử biên dịch:

Error 1 Cannot implicitly convert type 'WindowNamespace.Common.Handler' to 'Common.Handler' c:\Dev\YourSolution\MyWpfApplication\MyWindow.xaml 7 63 MyWpfApplication 

Dự án chung được tuyên bố một namespace toàn cục gọi là "chung" , thư viện điều khiển của bạn cũng đang sử dụng. Nhưng khi ứng dụng của bạn khai báo rõ ràng "WindowNamespace.Common", nó sẽ tạo ra một không gian tên cục bộ mà chỉ xảy ra là cùng một không gian tên mà điều khiển cha mẹ cư trú. Điều này có hiệu quả tạo ra vấn đề mơ hồ được mô tả trong Visual Studio documentation for Compiler Error CS0433.

Thay đổi khai báo vùng tên chung của bạn trong MyWpfApplication thành chỉ "Chung" và sự cố sẽ biến mất.

+0

Bạn chính xác về bản chất của sự va chạm không gian tên, mà nó giả định chung là chỉ một cái tồn tại trong không gian tên hiện tại chứ không phải là chung chung. Tuy nhiên, hai không gian tên chia sẻ cùng một tên là ... phổ biến và C# cung cấp các cơ chế để giải quyết các xung đột này mà không phải đổi tên một trong số đó. Những cơ chế này chỉ đơn giản là không thể được sử dụng trong trường hợp này vì tôi không phải là người viết C#, trừ khi XAML phơi bày một cách để làm điều này. –

+0

Tôi cho rằng bạn đã xem xét và từ chối bí danh rồi? Bạn có thể phải cung cấp thêm chi tiết, sau đó bạn sẽ kiểm soát các phần nào. Dù bằng cách nào tôi nghi ngờ điều này được tính là một lỗi trình biên dịch, nó sử dụng không gian tên bạn đang cho nó. Bạn có thể không ràng buộc sự kiện với một ICommand hoặc một cái gì đó và giải quyết sự va chạm trong mã? –

+0

Tôi không rõ ràng về cách tính năng bí danh có thể trợ giúp ở đây; bạn có thể làm rõ? Tôi không chỉ định loại không giải quyết được, vì vậy tôi không có cơ hội cung cấp bí danh không gian tên. Điều đó chỉ được chỉ định trong mã được tạo để gán trình xử lý sự kiện dựa trên sự kiện ràng buộc XAML. –

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