TLDR;Это невозможно без серьезной травмы.Но ... ЭТО ВОЗМОЖНО.
Я начал с воспроизведения проблемы, вот трассировка стека, чтобы доказать это:
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()
Вы можете видеть, что поставщики типов для элементов xaml(App1_XamlTypeInfo
) создаются во время выполнения, поэтому вы не можете переопределить эти методы [Factory | Instance Creation | Builder] с помощью настраиваемого кода.
Даже не пытаться создать неявное преобразование в классе Hex втип Shape может это исправить, очевидно, ограничение C # состоит в том, что вы не можете сделать пользовательское неявное преобразование из подкласса в базовый класс, потому что «оно изменяет уже скомпилированный код» или что-то еще: (*
Другой маршрут можетесли бы отдавал предпочтение инкапсуляции по сравнению с наследованием , вам потребуется заново реализовать / открыть класс Shape во всей его красе и манипулировать внутренним экземпляром Shape, однако будет ограничение в том, что вы не можетереализовать интерфейсы IShape и IShape2 из WPF, потому что они помечены как внутренние.
Насколько я могу судить, единственноеоставленный вариант состоит в том, чтобы изменить исходный код WPF и распространить его ... Я понятия не имею, по вопросам лицензирования, связанных с такими вещами.См. https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Shapes/Shape.cs для класса, который вам нужно изменить, или просто включите ваш собственный производный тип (например, Ellipse
), и https://referencesource.microsoft.com/#PresentationFramework/PresentationFramework.csproj, чтобы указать, что его довольно легко построить цитата нужна .
Надеюсь, кто-то еще придет и докажет, что я не прав ...