Пользовательская форма в Silverlight (перенос приложения из WPF)

Я конвертирую приложение WPF в Silverlight.

Приложение включает класс, который наследует от Shape. Он переопределяет свойство DefiningGeometry для возврата объекта Path. Однако класс Silverlight Shape не имеет свойства DefiningGeometry.

Чтение в Интернете Я нашел других с этой же проблемой. Решение, похоже, связано с наследованием от Control напрямую и установкой свойства Content в путь. Тем не менее, я также хочу сохранить обработчики событий (MouseEnter, MouseLeave, GotFocus, LostFocus), и я бы хотел, чтобы он сохранял его положение и изменял размер пропорционально остальной части приложения.

В основном я разработчик, поэтому это не моя сильная сторона - я был бы признателен, если бы кто-нибудь мог дать мне образец схемы, как это сделать.

Ответы

Ответ 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. Вы действительно обнаружили, что они не работают? Или вы просто предполагаете, что они не сработают?

Ответ 2

Что делать, если сохранить существующий класс, можно назвать его CustomShape, как есть, а затем присущим Control с чем-то вроде CustomShapeContainer? CustomShapeContainer по существу просто будет оберткой вокруг CustomShape. Затем вы можете передать все события, входящие в CustomShapeContainer, непосредственно в CustomShape, а затем вернуть формы Определяющий объект геометрии как содержимое контейнеров.

На первый взгляд это похоже на путь наименьшего сопротивления.

Ответ 3

У вас нет одинаковых пространств имен в Silverlight. Silverlight xaml - это подмножество WPF xaml, и есть сборки, которые не включены в Silvelright. Эти технологии предназначены для разных видов решений.

Возможно, вам придется начинать заново. Однако, если вы использовали шаблон MVVM, очень маленький код за ним, вы могли бы повторно использовать ViewModel, модель и сервисы. Возможно, ресурсы, стили будут в порядке, чтобы повторно использовать "как есть". Но View: начните новый.

Ответ 4

Начиная с Silverlight 3 существует специальный тип Shape, называемый Path, который определяет свойство Data типа геометрии. Вы должны иметь возможность перенести исходный код WPF, который создал свойство Geometry для этого свойства.