从形状派生的类会产生施法错误

Man*_*sly 8 c# uwp

我在UWP项目中有一个派生自Windows.UI.Xaml.Shapes.Shape的类:

public class Hex : Windows.UI.Xaml.Shapes.Shape
{
    public Hex()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

当我试图在mainPage.cs中实例化这个类的新成员时,我得到一个InvalidCastException,如下所示:

System.InvalidCastException: Specified cast is not valid.
       at Windows.UI.Xaml.Shapes.Shape..ctor()
       at App1.Hex..ctor()
       at App1.MainPage.Button_Click(Object sender, RoutedEventArgs e)
Run Code Online (Sandbox Code Playgroud)

这是mainPage.cs中的代码

private void Button_Click(object sender, RoutedEventArgs e)
{
    var h = new Hex();
    h.Width = 20;
}
Run Code Online (Sandbox Code Playgroud)

但两种方式都不起作用.据我所知,Shape的受保护构造函数应该能够从派生类访问,那么发生了什么?从Windows.UI.Xaml.Frameworkelemnt派生同样的事情没有问题.

Dan*_*son 1

太长了;没有严重的伤害是不可能的。但是……这是有可能的。

我首先重现问题,这是证明它的堆栈跟踪:

   at Windows.UI.Xaml.Shapes.Shape..ctor()
   at App1.Hex..ctor()
   at App1.App1_XamlTypeInfo.XamlTypeInfoProvider.Activate_0_Hex()
   at App1.App1_XamlTypeInfo.XamlUserType.ActivateInstance()
Run Code Online (Sandbox Code Playgroud)

您可以看到 xaml 元素 ( ) 的类型提供程序App1_XamlTypeInfo是在运行时生成的,因此您无法使用自定义代码覆盖这些 [Factory|Instance Creation|Builder] 方法。

即使尝试在 Hex 类中创建到 Shape 类型的隐式转换也无法解决此问题,这显然是 C# 的限制,您无法进行从子类到基类的自定义隐式转换,因为“它更改了已编译的代码” “ 管他呢 :(

另一种途径可能是支持封装而不是继承,您需要重新实现/公开 Shape 类的所有荣耀并操作内部 Shape 实例,但是存在一个限制,即您无法实现 IShape和来自 WPF 的 IShape2 接口,因为它们被标记为内部。

据我所知,剩下的唯一选择是修改 WPF 源代码并分发...我不知道与执行此类操作相关的许可问题。请参阅https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Shapes/Shape.cs 了解您需要更改的类,或者仅包含您自己的派生类型(如Ellipse),并且https://referencesource.microsoft.com/#PresentationFramework/PresentationFramework.csproj只是为了指出构建所需的引用非常容易。

希望其他人能出现并证明我错了......