Как создать универсальный пользовательский элемент управления xaml в UWP?


Я получаю странную ошибку XAML, которую я не понимаю, и надеюсь, что кто-то может помочь. Я пытаюсь создать универсальный пользовательский элемент управления AxisBase, который способен отображать любой тип данных. Затем я хочу расширить это, чтобы создать особый вид оси, которая может отображать даты на оси X и удваивать на оси Y.

Датедоублеаксис.xaml

<axis:AxisBase  x:Class="project.Views.Controls.Chart.Axis.DateDoubleAxis"
                x:TypeArguments="system:DateTime, system:Double"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:axis="using:project.Views.Controls.Chart.Axis"
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                xmlns:system="using:System">...</axis:AxisBase>


AxisBase.cs

namespace project.Views.Controls.Chart.Axis
{
    public class AxisBase<TX, TY> : UserControl {...}
}


Датедоублеаксис.код XAML.cs

namespace project.Views.Controls.Chart.Axis 
{
    public sealed partial class DateDoubleAxis : AxisBase<DateTime, Double> {...}
}

Но я получаю пару странных ошибок. В объявлении xaml DateDoubleAxis я получаю ошибку

Имя "AxisBase`2" не существует в пространстве имен " using: project.Просмотры.Контроли.Диаграмма.Ось "

"2", по моему мнению, исходит из того факта, что AxisBase имеет два общих типа, связанных с ним.



И тогда в объявлении DateDoubleAxis я получаю ошибку:

Базовый класс ' project.Просмотры.Контроли.Диаграмма.Ось.DateDoubleAxis ' отличается от заявленного в других частях

Вместе с ироническим предупреждением решарпера

Базовый тип 'AxisBase' уже указан в других частях

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

Может ли кто-нибудь указать мне, что я делаю неправильно?
1 2

1 ответ:

Я только что понял, что вы используете

x:TypeArguments="system:DateTime, system:Double"

В вашем XAML. К сожалению, это не поддерживается в UWP. Также имейте в виду, что Double в XAML должно быть определено как x:Double вместо system:Double. Но это все равно не имеет значения в данном случае.

Единственный способ, которым я получил эту работу в моем проекте, - это создать UserControl (с файлом XAML) в качестве базы чего-либо, а затем создать универсальный класс, который наследует от него. Как только универсальный класс установлен, я просто создаю связка производных классов на ее основе с различными типами. Например, в вашем случае у вас было бы

Основание UserControl: AxisBase

<UserControl x:Class="xxx.AxisBase"

public partial class AxisBase : UserControl
{
    public AxisBase()
    {
        InitializeComponent();
    }
}

Универсальный класс: AxisOfT

public class AxisOfT<TX, TY> : AxisBase { }

Производный класс: DateDoubleAxis

public class DateDoubleAxis : AxisOfT<DateTime, double> { }