以下、私が受け取っているエラーを再現する方法を説明します。それはVS 2010、2012、および2013で同じように動作します。これを複数のプロジェクトに分割すると、以下に示すように重要になります。XAMLから.NETへのコード生成のバグが原因で、この名前空間が衝突しますか?
手順エラーを再現する:
ソリューションを作成します。
using System; namespace Common { public delegate void Handler(object sender, EventArgs args); }
がMyControlLibraryと呼ばれるWPFユーザーコントロールライブラリプロジェクト、共通の参照を作成します:
- はHandler.csという名前のファイルを含む、一般的と呼ばれるC#クラスライブラリを作成します。その中に、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; } }
コモン、MyControlLibraryを参照し、MyWpfApplicationと呼ばれるWPFアプリケーションプロジェクトを作成します。その中に、WindowNamespace.Common.csと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) { } } }
ソリューションをビルドします。
あなたはMyWindow.xamlの7行目に指して、次のエラーを受け取る必要があります:あなたはMyWindow.xaml用に生成.gicsファイルを開く
The type or namespace name 'Handler' does not exist in the namespace 'WindowNamespace.Common' (are you missing an assembly reference?)
場合は、次のように表示されるはずですIComponentConnector.Connect方法:
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Common.Handler(this.MyControl_MyEvent);
問題の原因は、WindowNamespaceでCommon.Handlerを見つけようとしていることです。
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new global::Common.Handler(this.MyControl_MyEvent);
またはファイルの先頭に使用を追加することによって:これはそれのように生成したことによって解決することができ
using Common;
...
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Handler(this.MyControl_MyEvent);
これらすべてのソースファイルが単一のプロジェクトにバンドルされている場合は注意することを、 .gicsファイルが別々に生成される(つまり、イベントに明示的にハンドラを追加しない)ため、エラーは消えてしまいます。
これは実際にはXAML - > .NET変換のバグですか、間違っているのですか?
Error 1 Cannot implicitly convert type 'WindowNamespace.Common.Handler' to 'Common.Handler' c:\Dev\YourSolution\MyWpfApplication\MyWindow.xaml 7 63 MyWpfApplication
共通のプロジェクトは「共通」と呼ばれるグローバル名前空間を宣言している:あなたはMyWpfApplicationであなたのWindowNamespace.Common名前空間宣言でハンドラデリゲートを再宣言してコンパイルしようとした場合の手がかりは何が起こっているかのようあります
この問題を再現していただきありがとうございます。あまりにも悪いことに、まだ解決策はありません。いくつかの** clr-namespace:... **調整が**グローバル:**のネームスペースで問題を解決するように見えるでしょう。 –