UserControl, в дереве наследования которого имеется универсальный класс.

StackOverflow https://stackoverflow.com/questions/400778

Вопрос

Я пытаюсь создать UserControl, который наследуется от общего класса.Он наследуется не от обобщенного класса напрямую, а через промежуточный класс, который не использует обобщения.Это компилируется и работает во время выполнения, но во время разработки я получаю ошибку.

Вот мой общий родительский класс:

Public Class GenericParent(Of T)
    Inherits UserControl
End Class

Вот мой необщий родительский класс:

Public Class NonGenericParent
    Inherits GenericParent(Of String)
End Class

Вот мой XAML:

<local:NonGenericParent x:Class="SilverlightApplication5.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SilverlightApplication5"
    Width="400" Height="300">
    <StackPanel>
        <Button Content="Hello"/>
    </StackPanel>
</local:NonGenericParent>

Анализатор IntelliSense выдает следующие ошибки:

  1. Свойство «Ширина» не найдено в типе «NonGenericParent».
  2. Свойство «Высота» не найдено в типе «NonGenericParent».
  3. Тип «NonGenericParent» не поддерживает прямое содержимое.

Это похоже на то, как будто IntelliSense не может видеть дерево наследования за пределами класса GenericParent.Я попытался указать ContentPropertyAttribute непосредственно в классе SilverlightApplication5.Page, классе NonGenericParent, но это не сработало.

Я читал, что атрибут TypeArguments не поддерживается в Silverlight 2.0.Вот почему я создал промежуточный класс NonGenericParent.

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

Обновлять: Мы открыли заявку в службу поддержки MSFT, я сообщу об их решении.

Это было полезно?

Решение

Мы получили сообщение от Microsoft о том, что эта проблема вряд ли будет исправлена ​​в будущих версиях.После того, как они решили проблему, пытаясь найти ответственную группу, оказалось, что эта проблема принадлежит их группе разработчиков WPF, откуда и пришел ответ «не собираюсь это исправлять».

Тем временем мы обновили наш код, чтобы извлечь дженерики из родительских классов, пока, я думаю, не появится XAML 2009.

Другие советы

Не уверен насчет silverlight, но на С# он компилируется и работает как положено:


class GenericObject[T] : UserControl
{
}

class StaticObject : GenericObject[Int32]
{
    public Int32 wide { get { return this.Width; } }
}

private void Form1_Load(object sender, EventArgs e)
{
    StaticObject so = new StaticObject();
    this.Text = so.wide.ToString();
}

Так что, если он скомпилируется с помощью clr, он должен работать нормально.

Как вы предполагаете, это может быть просто ошибка intellisense.Обычно я бы не советовал игнорировать предупреждения компилятора, но в данном случае кажется, что предупреждение недействительно.

редактировать:замена угловых скобок квадратными скобками приводит к тому, что SO удалил их.

Несмотря на то, что Silverlight находится на уровне 2.0 (и особенно настройки VS2008 для Silverlight), он все еще очень молод.В IDE все еще есть свои особенности.

Проблема сохраняется даже после успешной сборки?

Кажется, это сообщение в блоге связано с вашей проблемой:

http://blogs.msdn.com/b/wpfsldesigner/archive/2010/01/22/known-issue-controls-deriving-from-a-generic-base-class-must-be-in-separate-assembly. aspx

Кажется, что для Silverlight у вас должно быть 3 класса, чтобы это работало.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top