2015-06-02 5 views
2

В XAML, пользовательское пространство имен может быть импортирован с xmlns директивой:Принудительно глобальное пространство имен в XAML

xmlns:custom="clr-namespace:GreatStuff" 

В C#, что пространство имен может быть импортирован с

using GreatStuff; 

Кроме того, оценка того, что пространство имен на основе глобального (корневого) пространства имен может быть приведено в исполнение следующим образом:

using global::GreatStuff; 

Как можно провести оценку на основе глобального пространства имен в XAML?


фона:

я столкнулся (правда, немного неясным) ситуацию, что существует такое пространство имен global::GreatStuff, который содержит класс управления WPF с именем ... GreatStuff (т.е. полное, это global::GreatStuff.GreatStuff в C#). В том же пространстве имен я хочу использовать этот элемент управления в окне WPF.

Интересно, что в этом созвездии, я не могу использовать атрибут Name/x:Name на любые элементы управления типа global::GreatStuff.GreatStuff в моем файле XAML для окна:

Имя типа «GreatStuff» не существует в типе " GreatStuff.GreatStuff. (CS0426)

Обратите внимание, что тот же самый файл компилируется нормально, если я не указываю атрибут в Name/x:Name!

Теперь, почему компилятор должен предположить, что, установив атрибут Name/x:Name, я пытаюсь получить доступ к чему-то, что называется GreatStuff.GreatStuff.GreatStuff?

Ответ можно найти, просмотрев файл .g.cs, созданный в окне XAML-файла окна. В этом файле, то XAML фрагмент

<custom:GreatStuff x:Name="stuff"/> 

компилируется следующим C# фрагмент кода:

internal GreatStuff.GreatStuff stuff; 

То есть, используется полное имя, но без явного глобального пространства имен маркера.

Конечно, как поле в классе в пространстве имен global::GreatStuff, все это заворачивается в

namespace GreatStuff { 

И так, бедный C# компилятор не может помочь, но предположим, что stuff должен быть типа global::GreatStuff.GreatStuff.GreatStuff. Этого можно было бы избежать, если в

xmlns:custom="clr-namespace:GreatStuff" 

я мог бы обеспечивать, что любое упоминание о том префикса пространства имен могут быть преобразованы в то время как соблюдение глобального пространства имен.

По причинам, внешним по отношению к этому вопросу, изменение пространства имен и/или имен классов здесь не является вариантом.

ответ

0

Эта проблема возникает только при выполнении всех следующих условий:

  1. У вас есть класс с одинаковым именем пространства имен, содержащих его.
  2. В этом же пространстве имен у вас есть файл xaml с экземпляром объекта, который также объявлен в этом пространстве имен.
  3. Этому конкретному экземпляру объекта присваивается атрибут Name или x: Name.

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

Насколько я знаю, это ограничение компилятора xaml, и вам нужно будет обратиться к Microsoft за его разрешением. Единственное, что я могу придумать, это попытаться обойти его с помощью настраиваемого процесса сборки, который создает xaml, позволяет редактировать сгенерированные файлы, а затем создавать код. Это потребует некоторых исследований, чтобы выяснить, как настроить.