Почему при добавлении атрибута x: Name в пользовательский элемент управления возникает ошибка компиляции? - PullRequest
8 голосов
/ 28 июля 2010

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

У меня есть пользовательский элемент управления Xaml, который содержит другой пользовательский элемент управления, подобный этому:


<UserControl x:Class="MyModule.View.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:igDock="http://infragistics.com/DockManager"
    xmlns:views="clr-namespace:MyModule.View"
    >
  <StackPanel x:Name="panel">
    <views:MyHeaderView/>
    <igDock:XamDockManager x:Name="dockingManager"/>
  </StackPanel>
</UserControl>

Это внутри модуля Prism (отсюда и название MyModule), но в остальном я не думаю, что это что-то особенно необычное.

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

<views:MyHeaderView x:Name="header"/>

Ошибка, которую я получаю, просто:

"The type name 'View' does not exist in the type MyModule.MyModule'"

Я пытался переместить содержащийся пользовательский элемент управления в другое пространство имен, создал пустой пользовательский элемент управления и попытался с тем же результатом и удалил XamDockManager, но, похоже, ничто не имеет никакого значения.

Может кто-нибудь пролить свет на это?

Ответы [ 5 ]

6 голосов
/ 28 июля 2010

Я думаю, что нашел ответ.

Если я переименую класс модуля в MyModuleThingy, он скомпилируется.Кажется, проблема возникает из-за того, что класс модуля имеет то же имя, что и пространство имен, в котором он находится (MyModule.MyModule).

Если кто-нибудь может сообщить мне, почему это может быть проблемой, я был бы очень заинтересованзнать.Особенно потому, что я унаследовал много кода, где, как представляется, это общий шаблон в данной конкретной реализации Prism.

3 голосов
/ 29 марта 2011

Проблема в том, что у вас есть класс и пространство имен с тем же именем.Если у вас есть что-то вроде:

namespace MyModule {
    public class MyModule {
    }
    public class MyView {
    }
    public class MyControl {
        public void Foo() {
            MyModule.MyView v = ..;
        }
    }
}

Тип перед v будет думать, что MyView находится в типе MyModule как вложенный тип.Он не разрешает MyModule как пространство имен, так как тип выигрывает на основе типа правила разрешения C #.

Сгенерированный код просто берет пространства имен, которые вы определили в xmlns, и добавляяэто при создании вспомогательного поля (из-за атрибута x: Name).Таким образом, вы получите MyModule.View.MyHeaderView, где MyModle прерывается как тип, а не пространство имен.

1 голос
/ 30 марта 2011

Мне не повезло назвать мой проект TextEditor, и, очевидно, его имя конфликтовало с выходящим классом MS. Мои попытки добавить атрибут x.Name или Name в ссылку на мой пользовательский элемент управления вызвали ошибку компиляции, из-за которой компилятор не может найти мой пользовательский элемент управления. Видимо, он смотрел на класс MS, а не на местный проект. Я переименовал проект в TextEditorProject, мне пришлось использовать Grep, чтобы найти все вхождения, но в конце концов я все заработал.

0 голосов
/ 28 июля 2010

WPF не нравится, когда вы используете x: Name для элемента управления, определенного в вашей сборке, предполагая, что xmlns: views = "clr-namespace: MyModule.View" является той же сборкой, что и ваша

Вместо этого используйте имя, и все будет в порядке

0 голосов
/ 28 июля 2010

Может быть, у вас есть класс с именем "View", такой же, как пространство имен?

...