【问题标题】:How to create a generic xaml user control in UWP?如何在 UWP 中创建通用 xaml 用户控件?
【发布时间】:2017-08-16 12:53:51
【问题描述】:

我收到一个奇怪的 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 声明中,我得到了错误

命名空间“using:project.Views.Controls.Chart.Axis”中不存在名称“AxisBase`2”

我相信'`2'来自AxisBase 有两个与之关联的泛型类型。



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

“project.Views.Controls.Chart.Axis.DateDoubleAxis”的基类与其他部分声明的不同

伴随着讽刺性的重发警告

基本类型“AxisBase”已在其他部分指定

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

谁能指出我可能做错了什么?

【问题讨论】:

  • 您的 AxisBase 不能采用泛型类型,因为它具有 xaml 部分。您应该将其保留为普通用户控件,并将 DateDoubleAxis 设为 DateDoubleAxis&lt;TX, TY&gt; 并继承自 AxisBase
  • @JustinXL AxisBase 没有 xaml 组件(我添加了文件名以使其更清晰)。我打算让DateDoubleAxis.xaml sn-p 表明DateDoubleAxisAxisBase&lt;DateTime, Double&gt;,以模仿DateDoubleAxis.xaml.cs 中的类声明。这实际上不是正在发生的事情吗?

标签: c# xaml uwp user-controls


【解决方案1】:

我刚刚意识到你正在使用

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

在您的 XAML 中。不幸的是,这在 UWP 中不受支持。另请记住,XAML 中的 Double 应定义为 x:Double 而不是 system:Double。但无论如何,这在这种情况下是无关紧要的。

我在我的项目中得到这个工作的唯一方法是创建一个UserControl(带有 XAML 文件)作为任何东西的 base,然后创建一个 通用类继承自它。一旦泛型类就位,我只需创建一堆基于它的具有不同类型的派生类。例如,在您的情况下,您将拥有

基础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> { }

【讨论】:

  • 非常感谢您对此@JustinXL 的回答。您的答案可以编译,这很好,但不允许派生类具有 XAML 部分,这很不幸。这对我来说本质上意味着不能存在通用用户控件。我很犹豫要不要检查你的答案,因为它似乎不存在一个“正确”的答案,但我会这样做是为了感谢你的时间=)
  • 请投票here
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多