Ответ 1
Вы не сможете создать класс, который работает одинаково, потому что Silverlight не поддерживает создание пользовательских элементов, которые происходят из базового класса Shape
.
Причина, по которой невозможно создать пользовательскую форму в Silverlight, заключается в том, что Silverlight не использует WPF "визуальный слой". Если вы хотите полностью понять, почему то, что вы пытаетесь, невозможно, вам нужно понять, как Silverlight очень отличается от WPF здесь. (И если вам все равно, пропустите следующие два абзаца.)
В WPF вы можете работать на двух совершенно разных уровнях: визуальном или каркасном. Сервисы визуального уровня предоставляются WindowsBase.dll и PresentationCore.dll. Это обеспечивает базовые услуги рендеринга и ввода. Но если вам нужны такие вещи, как стилизация, привязка данных, макет, шаблоны и т.д., Вам нужны службы фреймворка, и они предоставляются PresentationFramework.dll. Типы форм - Rectangle
, Path
и т.д. - все типы фреймворков - они происходят от FrameworkElement
, и они поддерживают привязку данных, макет, анимацию и т.д. Но они реализованы поверх визуального слоя - если вы посмотрите на любой из типов Shape
в Reflector или ILDASM, вы увидите, что все они переопределяют метод OnRender
и что там, где код, определяющий реальную форму жизни, (OnRender
- функция визуального слоя.) И поскольку визуальный уровень является полностью поддерживаемым и документированным API, вы можете писать свои собственные фигуры в WPF - вы можете написать точно такой же код, как вы найдете во встроенных классах формы.
Silverlight не делает это визуальное/фреймворческое различие - в Silverlight визуальный слой WPF по существу сворачивается в каркасный слой. Поэтому, если вы посмотрите на типы фигур в Reflector или ILDASM, вы увидите, что они не содержат метода OnRender
, и они почти пусты. Это потому, что в Silverlight формы являются внутренними - плагин имеет встроенную специальную обработку для Ellipse
, Path
и всех других фигур. Таким образом, набор форм не открыт для расширения в Silverilght. В Silverlight нет метода OnRender
для переопределения. Таким образом, вы просто не можете написать свой собственный пользовательский класс, который происходит от Shape
в Silverlight.
Итак, я боюсь, что пользовательский Control
или UserControl
будет путь. Это не должно останавливать работу MouseEnter
и MouseLeave
. Вы действительно обнаружили, что они не работают? Или вы просто предполагаете, что они не сработают?