3

AssemblyInfo.cs複数の CLR 名前空間を単一の XML 名前空間にグループ化する WPF プロジェクトがあります。

[assembly: XmlnsDefinition("http://foo.bar", "MyLibary.Controls")]
[assembly: XmlnsDefinition("http://foo.bar", "MyLibary.Converters")]

XAML では、これは次のように使用されます。

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:fb="http://foo.bar">
    <fb:FooButton IsEnabled="{Binding Something, Converter={fb:FooConverter}}"/>
</UserControl>

これは、XAML が正常にインスタンス化されている場合にうまく機能しますが、現在、XamlReader.

問題: 複数の CLR 名前空間を単一の XML 名前空間にマップできないようです。に最後に追加された定義XamlTypeMapperだけが残っているようです (たとえば、以前の登録が上書きされます)。

var parserContext = new ParserContext();
parserContext.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
parserContext.XmlnsDictionary.Add("fb", "http://foo.bar");

parserContext.XamlTypeMapper = new XamlTypeMapper(new string[] {"MyLibrary"});
parserContext.XamlTypeMapper.AddMappingProcessingInstruction("http://foo.bar", "MyLibrary.Converters", "MyLibrary");
parserContext.XamlTypeMapper.AddMappingProcessingInstruction("http://foo.bar", "MyLibrary.Controls", "MyLibrary");

...

var rootNode = XamlReader.Load(memeoryStream, parserContext) as FrameworkElement

エラーメッセージは次のとおりです。

'Cannot create unknown type '{http://foo.bar}MyConverter'.'

すべてのコードを単一の共通 CLR 名前空間に配置すると、すべてが機能しますが、残念ながらこれはオプションではありません。XAML コンテンツを動的にロードする目的で、複数の CLR 名前空間を単一の XML 名前空間にマップした人はいますか?

前もって感謝します!

4

1 に答える 1

5

上記のコメントで述べたように、解決策はXamlReader.Load、型マッパーとコンテキストをすべて一緒に呼び出して削除する前に、アセンブリを手動で読み込むことです。

Assembly.Load("MyLibrary");
var rootNode = XamlReader.Load(memeoryStream) as FrameworkElement

XamlTypeMapperはアセンブリのリストで初期化されるため、このクラスはアセンブリのロードを担当する (おそらくそうである) と想定していましたが、 の動作によりAddMappingProccessingInstruction、これが機能しなくなります。

于 2011-11-24T13:43:56.290 に答える