如何在 UWP 中创建通用 xaml 用户控件?

How to create a generic xaml user control in UWP?

我遇到了一个奇怪的 XAML 错误,我不明白我希望有人能提供帮助。我正在尝试制作一个能够绘制任何类型数据的通用 AxisBase 用户控件。然后我想扩展它以创建一种特定类型的轴,可以在 X 轴上绘制日期并在 Y 轴上加倍绘制日期。

DateDoubleAxis.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 {...}
}


DateDoubleAxis.xaml.cs

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

但是我遇到了一些奇怪的错误。在 DateDoubleAxis 的 xaml 声明中,我得到错误

The name "AxisBase`2" does not exist in the namespace "using:project.Views.Controls.Chart.Axis"

我认为“2”来自于 AxisBase 有两个与之关联的泛型类型。



然后在 DateDoubleAxis 的声明中出现错误:

Base class of 'project.Views.Controls.Chart.Axis.DateDoubleAxis' differs from declared in other parts

连同具有讽刺意味的 resharper 警告

Base type 'AxisBase' is already specified in other parts

我意识到我在尝试从我自己的用户控件扩展时做的事情有点奇怪,但我认为在这种情况下它是有意义的,至少,一些用户已经提出了建议 here.

任何人都可以指出我可能做错了什么吗?

我刚刚发现你正在使用

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

在你的 XAML 中。不幸的是,这在 UWP 中不受支持。还要记住 XAML 中的 Double 应该定义为 x:Double 而不是 system:Double。但这在这种情况下是无关紧要的。

我在我的项目中使用它的唯一方法是创建一个 UserControl(带有 XAML 文件)作为任何东西的 base,然后创建一个继承自它的 generic class。一旦通用 class 到位,我就创建了一堆基于它的不同类型的 derived classes。例如,在您的情况下,您将拥有

基地UserControlAxisBase

<UserControl x:Class="xxx.AxisBase"

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

通用 class: AxisOfT

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

派生class:DateDoubleAxis

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