Базовый класс UserControl в приложении Windows 8 XAML Metro

Я работаю над приложением Metro, используя XAML и C#. Я начал это с помощью WPF в Win7. Я создал базовый класс, унаследованный от UserControl, а затем попытался поместить его в свой XAML.

В Windows 7 это отлично работало:

<MyType:AnImplementation
 ...
 xmlns:MyType="clr-namespace:MyAppNamespace"
/>

Я пробовал то же самое в Win8, но, к сожалению, получаю ошибки -

<MyType:AnImplementation
 ...
 xmlns:MyType="using:MyAppNamespace"
/>

теперь выдает это: Неожиданный сбой задачи CompileXaml. Затем исключение нулевой ссылки.

Я не гений WPF, поэтому, возможно, я делаю это совершенно неправильно - я только недавно начал вникать в это, но у меня возникли проблемы с выделением этой проблемы. Это какая-то проблема курицы/яйца, или есть другой способ создания пользовательских элементов управления в Win8 XAML?

изменить: я подумал, что было бы полезно быть более ясным. У меня нет проблем с созданием пользовательских элементов управления, у меня возникают проблемы с созданием пользовательских элементов управления моего собственного базового типа, который наследуется от UserControl. Например:

Базовый класс мы назовем MyBaseType, который наследуется от UserControl и имеет несколько виртуальных методов:

public class MyBaseType : UserControl
{
    public MyBaseType() : base() {}
}

Новый пользовательский элемент управления ActionTile:

public partial class ActionTile : MyBaseType {}

Когда я помещаю это в свой XAML:

<myType:MyBaseType
    ... (other XAML imports)
    xmlns:myType="using:MyNamespace"/>

Компилятор взрывается.

Если вы хотите реплицировать, создайте базовый класс, наследуемый от UserControl, затем реализуйте элемент управления, наследуемый от базового класса, и попытайтесь создать новый UserControl этого нового типа. Как я уже сказал, отлично работает в WPF на Windows 7.


person jpda    schedule 18.01.2012    source источник
comment
Я сам начинаю это подозревать; либо ошибка компилятора Xaml, либо другой синтаксис, который еще нигде не задокументирован. Есть несколько звонков о помощи, если я что-то найду, я обязательно опубликую это.   -  person jpda    schedule 26.01.2012


Ответы (2)


Элементы XAML WinRT отличаются от элементов XAML WPF. В WPF класс UserControl определен в пространстве имен System.Windows.Controls. Принимая во внимание, что UserControl для WinRT определен в Windows.UI.Xaml.Controls.

Вы должны убедиться, что используете классы из правильного пространства имен при перемещении кода из WPF в WinRT. Обычно элементы WPF определяются в пространстве имен System.Windows, а элементы WinRT XAML определяются в Windows.UI.Xaml.

Элементы XAML, определенные в Windows.UI.Xaml, на самом деле являются объектами WinRT с .Net RCW для доступа к этим объектам. Вот почему вы можете использовать элементы WinRT XAML в собственном коде C++.

person sarvesh    schedule 23.01.2012
comment
После перехода на WinRT я изменил наследование на Windows.UI.Xaml.Controls.UserControl, но получил тот же результат. Я подозреваю, что это либо ошибка в компиляторе Xaml, либо изменение синтаксиса между WPF Xaml и WinRT Xaml, по которому я не могу найти документацию. - person jpda; 26.01.2012
comment
Я попробовал это, и это ошибка. Если вы посмотрите на YourPage.g.cs в нашем каталоге obj, вы заметите, что класс по-прежнему отображается как унаследованный от UserControl. Похоже, что этот файл не перезаписывается после внесения изменений. Я смог запустить его нормально после удаления папки obj и bin. - person sarvesh; 26.01.2012
comment
Спасибо за помощь - я тоже могу повторить. Определенно ошибка. - person jpda; 31.01.2012

Да, Win 8 XAML поддерживает пользовательские элементы управления. Лучший способ приблизиться к этому — добавить новый пользовательский элемент управления через пункт меню «Добавить новый». Это должно дать вам пустой пользовательский элемент управления, который компилируется. Затем вы можете построить поверх этого шаблона.

person ColinE    schedule 19.01.2012
comment
Thx - отредактировано для большей ясности. Проблема не в создании пользовательских элементов управления, а в создании одного из базовых типов, который затем наследуется от UserControl. - person jpda; 20.01.2012