WPF: пользовательское пространство имен XAML

Итак, у меня есть окно в WPF. Я добавляю следующую строку внутри него:

xmlns:controls="clr-namespace:mCubed.Controls"

Это компилируется и работает нормально, но дизайнер Visual Studio выдает мне эту ошибку:

Не удалось загрузить файл или сборку «mCubed, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null» или одна из ее зависимостей. Система не может найти указанный файл.

Когда я удаляю эту строку из окна, она компилируется и работает просто отлично, а дизайнер Visual Studio работает как шарм!

Я не понимаю, почему эта строка ломает конструктор? Это происходит НЕЗАВИСИМО, если я поместил следующую строку в тело документа XAML.

<controls:MyControl/>

Все мои файлы .cs находятся в одном проекте VS. У меня есть пространство имен mCubed, которое содержит мой умно названный класс mCubedWindow. У меня все классы элементов управления определены в пространстве имен mCubed.Controls. НЕ говорите мне, что это проблема сборки, ВСЕ МОИ ФАЙЛЫ В ТОМ ЖЕ ПРОЕКТЕ VS!


person Nick    schedule 21.03.2009    source источник


Ответы (4)


Не проблема сборки, просто проблема конструктора. Конструктор VS WPF 2008 года в лучшем случае примитивен - ИМХО совершенно бесполезен. Я полностью отключаю его и вместо этого использую редактор XML. Надеюсь, в 2010 году ситуация резко улучшится.

person Kent Boogaart    schedule 21.03.2009

MyControl находится в той же сборке, что и окно? Если это не так, вам нужно включить имя сборки в объявление:

xmlns:controls="clr-namespace:mCubed.Controls;assembly=mCubed"
person Daniel Pratt    schedule 21.03.2009
comment
Думаю, это в том же проекте Visual Studio. Он компилируется и работает без проблем, так что я не думаю, что это проблема. Он даже не должен компилироваться, если это так. - person Nick; 21.03.2009

Это немного странно. Я разработал несколько проектов, которые делают именно это. Вот быстрый фиктивный проект, все в одном .exe:

Во-первых, UserControl с парой кнопок:

<UserControl x:Class="WpfApplication1.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid Width="30">
        <Button HorizontalAlignment="Left">A</Button>
        <Button HorizontalAlignment="Right">B</Button>
    </Grid>
</UserControl>

Теперь главное окно с моим добавленным элементом управления:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:p="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <p:UserControl1/>
    </Grid>
</Window>

Нигде нет сообщений об ошибках.

person Daniel Earwicker    schedule 21.03.2009
comment
Я поместил свои пользовательские элементы управления в папку Controls в моем проекте, если это имеет значение. - person Nick; 22.03.2009

Является ли XAML свободным (действие сборки: нет, без кода) или скомпилированным (действие сборки: страница, может содержать код)?

Если XAML свободен или MyControl находится в другой сборке, вы должны указать, в какой сборке находится MyControl, как сказал Дэниел Пратт:

xmlns:controls="clr-namespace:mCubed.Controls;assembly=mCubed"

Убедитесь, что сборка mCubed и ее зависимости (ссылки) скопированы в выходной каталог. Если это не так, то добавьте mCubed в качестве ссылки на стартовый проект.

person Danny Varod    schedule 25.07.2009