我在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派生同样的事情没有问题.
太长了;没有严重的伤害是不可能的。但是……这是有可能的。
我首先重现问题,这是证明它的堆栈跟踪:
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只是为了指出构建所需的引用非常容易。
希望其他人能出现并证明我错了......
归档时间: |
|
查看次数: |
360 次 |
最近记录: |