Использование пользовательских пространств имен XML для ссылки на внешние библиотеки DLL в Kaxaml - PullRequest
6 голосов
/ 20 ноября 2011

Я могу заставить Kaxaml загружать внешние сборки с использованием пространств имен CLR, но это очень неудобно, потому что нужно много сопоставлений, чтобы нацеливаться на все разные пространства имен в сборке, в то время как пользовательское XmlnsDefinition в сборке позволило бы уйти только с одним или несколькими.

При поиске решения я, очевидно, нашел этот вопрос , но, похоже, он охватывает только использование пространств имен CLR, поскольку ни один из ответов не работает для пользовательских пространств имен ( "Невозможно задать неизвестное участник ... ").

Пример:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
  xmlns:is="http://schemas.microsoft.com/expression/2010/interactions">
<!-- ... -->
<Button Content="Test">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <is:ChangePropertyAction PropertyName="IsOpen"
                                TargetName="popup"
                                Value="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

Это не будет работать, однако если вы используете CLR:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
  xmlns:is="clr-namespace:Microsoft.Expression.Interactions;assembly=Microsoft.Expression.Interactions"
  xmlns:isc="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions">
<!-- ... -->
<Button Content="Test">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <isc:ChangePropertyAction PropertyName="IsOpen"
                                TargetName="popup"
                                Value="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

Пространство имен is здесь не используется, и мне пришлось добавить подпространство имен сборки взаимодействий.

Было бы идеально, если бы первый метод работал.

1 Ответ

4 голосов
/ 20 ноября 2011

Поэтому, набирая этот вопрос, я наткнулся на один способ использования пользовательских пространств имен: вам нужно заставить Kaxaml загрузить сборку хотя бы один раз.

Это можно сделать с помощью некоторого фиктивного объекта, который ссылается на CLR-пространство имен в указанной сборке.Если разбор этого загрузчика можно удалить, разумеется, это нужно делать каждый раз при запуске Kaxaml.например,

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:is="http://schemas.microsoft.com/expression/2010/interactions">
    <Page.Resources>
        <FrameworkElement x:Key="loader"
                xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
                xmlns:is="clr-namespace:Microsoft.Expression.Interactions;assembly=Microsoft.Expression.Interactions" />
    </Page.Resources>

Используя фрагменты или файл по умолчанию, это можно сделать сравнительно удобным, но все же не идеальным, поэтому, если кто-то знает хорошее исправление, пожалуйста, дайте мне знать.

...