如何在 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。例如,在您的情况下,您将拥有
基地UserControl
:AxisBase
<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> { }
我遇到了一个奇怪的 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。例如,在您的情况下,您将拥有
基地UserControl
:AxisBase
<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> { }