![]() |
|
Модераторы: gambit, Kefir, Partizan |
![]()
|
|
| Anyone |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
В гриде находится множество элементов, которые выравниваются по центру, справа, слева, но нужно их размещать на в самой ячейке, а слева исправа от нее. Смещаю с помощью свойства Margin, но не все так гладко.
Первая проблема заключается в том, что не все элементы при этом смещаються. Если с линией проблем нет, то, к примеру, с Label я замучился - никак не могу разместить так, чтобы этот элемент привязывался к левому или правому краю, но извне яейки, тоесть, если проилюстрировать, то чтоб увеличение длины происходило в таком направлении: < -- Label | | Label -- > Вторая проблема заключается в том, что при уменьшении размеров объекта, элементы извне ячейки грида могут исчезнуть, даже если внутри ячейки элементы еще будут видны. Как решить эти 2 проблемы? |
|||
|
||||
| Pilger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 10.5.2008 Где: Германия Репутация: нет Всего: нет |
-------------------- Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert. |
|||
|
||||
| exBlender |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 2.10.2009 Репутация: 9 Всего: 9 |
По описанию неясно, почему нельзя усложнить лейаут, добавив в Grid лишние Columns или поместив Grid вовнутрь другой Grid или панели.
--------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт. |
|||
|
||||
| Anyone |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Мне важно чтоб ширина объекта равнялась ширине грида (исходя из этой ширины рисовать адорнер), но некоторые элементы (линии, лейбы) должны находися извне ячеек грида. Ну или панели. Скорее всего можно по другому решить задачу, но это пока что единственный простой вариант, который приходит в голову. |
|||
|
||||
| exBlender |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 2.10.2009 Репутация: 9 Всего: 9 |
Простой вариант - это сделать дополнительную внешнюю Grid c тремя колонками и поместить в среднюю колонку существующую Grid с объектом, а лейблы вынести из внутренней Grid в левую и правую колонки внешней.
Вообще же, привязка Label к левому краю должна происходить без проблем, но левая Label должна быть другого стиля, нежели правая Label: внутри Template левой Label должно быть указано выравнивание контента по правому краю. Ну, и сама она - тоже, естественно. Это сообщение отредактировал(а) exBlender - 6.10.2009, 10:53 --------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 2 Всего: 72 |
Размещение элементов адорнера все равно приходится писать самому. Так зачем возиться с гридом? Пиши свой менеджер размещения. Для управления размещением можно использовать присоединённые свойства:
|
|||
|
||||
| Anyone |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Нет, лейблы не являются элементами адорнера, просто адорнер должен рисоваться вокруг объекта, а лейблы изображаться извне этого объекта. Кроме того свойства Left, Right должны задавать координаты объекта, а не тех лейблов, которые находятся извне. Я так понимаю, что в этом случае лучше всего самому определить реакцию на изменение свойств Left, Right и самому определять расположение и размер адорнера? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 2 Всего: 72 |
У метки есть свойство Target, которое определяет объект, на который она указывает. Если нужно использовать другие элементы, нужно использовать своё присоединённое свойство вместо него. Создаёшь свой класс, наследующий Panel по образцу Grid или Canvas и сам размещаешь на нём элементы как тебе надо. Обычные элементы размещаются согласно свойства Left, Top или Column,Row, а метки согласно свойствам Target и Align после размещения основных элементов. Адорнеры размещаются в adornerLayer панели и могут управлять не только своим объектом, но и прсоединёнными к нему метками.
Свойство Align является перечислением:
|
|||
|
||||
| Anyone |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
math64,
Интересная идея, но мне не все ясно. Поскольку мне нужно не только метки, а и другие контролы, я так понял, что лучше всего определить в своей панели присоединённое свойство Target (ну или с другим названием), помимо Align. Правильно я понял? А далее мне не ясно как размещать эти присоедененные контролы: опять же извне панели (грида), или уже внутри? Если извне, то будут те же проблемы, что я имею сейчас, а если внутри, то нужно будет управлять размерами адорнера и определять свои свойства Left, Top. В итоге я не понимаю зачем вообще эти присоедененные свойства, что это даст, кроме гибкости?.. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 2 Всего: 72 |
Допустим, у тебя есть MyPanel. На ней размещена Button и Label слева от неё. Положение кнопки определяется присоединенными свойствами MyPanel.X и MyPanel.Y:
1. MesureOverride Панель определяет свои размеры - определая размеры кнопки и метки. Метка выдаст размеры увеличенные на Margin. 2. ArrangeOverride Панель размещает кнопку по координатам X,Y и метку слева от неё. Margin определяет расстояние между кнопкой и меткой (учитывать не надо, WPF обработает автоматически). 3. OnRender - здесь можно нарисовать сетку. Кнопка и метка рисуется автоматически. 4. адорнеру в конструктор передаются MyPanel и кнопка. Он рисует себя вокруг кнопки. Кроме того, он может просмотреть Children у MyPanel, найти метку и создать для неё второй вспомогательный адорнер. В сложном адорнере используется VisualCollection переопределяется ArrangeOverride, в простом переопределяется OnRender. |
|||
|
||||
| Anyone |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
math64,
Спасибо за более подробное описание, но я начинаю понимать что, возможно, в моем случае проще всего реализовать более "умный" адорнер объекта и сам объект, чем переопределять панель (грид). Нужно его рисовать вокруг конкретной ячейки, но управялть объектом вцелом. Попробую оба варианта. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 2 Всего: 72 |
Возможен ещё один способ размещения, без создания собственного класса панели - размещение объектов и меток в разных слоях:
Нет, такие биндинги почему-то не работают. Но можно устанавливать координаты метки вручную, в обработчиках соответствующих событий. Это сообщение отредактировал(а) math64 - 8.10.2009, 14:18 |
|||
|
||||
| Anyone |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Мой вариант решения задачи у меня не получается - много нужно переделывать.
Пока не начал писать свою панель, спрошу. К примеру если я переопределю грид, можно будет свойствами Width, Height и прикрипленными свойствами Left, Top (Column, Row) изменять расположение и размеры конкретной части секи, которой будет ограничиваться сам объект, к примеру колонки 2-3 и рядки 2-4, а остальные ячйки будут выравниваться в соответсвии с новым рассположением и размером этой части сетки? Если да - то это то, что мне нужно, иначе придется что то другое выдумывать. А по поводу биндингов я уже думал, но еще не пробывал. Это сообщение отредактировал(а) Anyone - 8.10.2009, 16:00 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 2 Всего: 72 |
При разработке своей канвы можно добавить в неё свойства GridSize, GlueSize, bool ShowGrid. При перемещении объекта если граница или центр объекта оказывается ближе чем GlueSize к сетке, он приклеивается к сетке. Приклеивание происходит при отпускании кнопки мыши в адорнере. При движении адорнер может подсветить линию сетки, к которой будет приклеиваться объект. Реши, нужны ли слои в канве. Свойства Width и Height доспупны только у объектов, для которых они заданы явно. После вызова Mesure доступно свойство DesiredSize, после отображение на экране ActualWidth и ActualHeight. Поскольку тебе нужно вращать объекты, вместо свойств Left и Top удобнее задавать координаты центра вращения.
|
|||
|
||||
| Anyone |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Возможно ты меня не совсем понял, потому еще раз напишу что я хочу на всякий случай. Пишу графический редактор. Свою канву я уже написал - добавил сетку, часть на которую можно добавлять элементы (холст), фон под холстом. На этом канвасе можно размещать объекты, которые можно выделять перемещать, вращать, изменять размеры (это уже сделано), причем некоторые надписи, линии и другие элементы ( в том числе и свои), должны находится извне размеров объекта (к примеру название - выше объекта, с этим пока проблемы). Объекты должны иметь возможность соединятся линиями связей (не просто линиями, а сложными ломаными), при чем они должны проходить через конкретные точки, или выводы (это еще не начинал). Каждый объект является производным от Control и внешний вид описывается в своем словаре ресурсов, который подключается динамически. Таким образом, можно накидать в папку словари ресурсов (если упрощенно) и графический редактор будет иметь такое же количество доступных объектов для добавление на канву (инструментов тулбокса). Иными словами в шаблоне может быть что угодно - от простого прямоугольника, до сложного самописного контрола. Если объект описывать как грид, в ячейках которого находятся какие-нибудь элементы, то проблему я описал. Думаю в этом случае действительно лучше всего написать свой контейнер, который будет содержать "видимую" часть (положение и размеры объекта), и часть извне объекта, где можно будет размещать элементы, но эта часть не будет фигурировать при изменении размеров и положения объекта, а будет подстраиватся под "видимую" часть. Это сообщение отредактировал(а) Anyone - 9.10.2009, 15:16 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | WPF и Silverlight | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |