Как создать универсальный пользовательский элемент управления 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 ответ:
Я только что понял, что вы используете
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> { }