![]() |
Модераторы: gambit, Kefir, Partizan |
![]() ![]() ![]() |
|
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
Доброе утро, друзья!
Продолжаю задавать глупые вопросы по WPF..(предварительно разумеется гуглю). Хотелось бы услышать ваше профессиональное мнение по реализации одного компонента. Согласно поставленной мне задаче в программе должна быть бегущая строка. По скольку она должна быть довольно сильно стилизована (сложный фон, двигается не только текст но и пиктограммы), то я решил делать это следующим образом. Создал свой класс CreepLine унаследовав его от Canvas, объявил нужные DependencyProperty, перегрузил GetVisualChild, VisualChildrenCount. Объявил объект DrawingVisual, который добавляю на канву через AddVisualChild и AddLogicalChild, на нем я и хочу рисовать все что мне надо. Далее я хочу отрендерить данные и clip-ать их по нужному прямоугольнику. А в анимации менять свойство которое будет отвечать за смещение прямоугольника обрезки. Вопрос на сколько оправдана такая реализация и вообще возможно ли она? Не будет ли проблем с производительностью? Быть может есть более "гуманный" способ реализации бегущей строки? К сожалению в интернете я ни где не смог найти реализации бегущей строки на wpf, разве что только в текстовом поле DataGrid, но мне это ведь не катит... С Уважением, Александр |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 13 Всего: 59 |
Я тоже реально толкового не нашел, поэтому сделал свой. Код выложить не могу (права конторы), но опишу использованную идею, как время будет. -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
Буду ждать с нетерпением.
|
|||
|
||||
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
Кстати попробовал реализовать идею и неожиданно столкнулся с проблемой создания пустого изображения. Хочу сделать следующее:
1) Рассчитать ширину изображения, путем сложения ширины текста (FormattedText мне в помощь) и пиктограм + margin. 2) Создать изображение и отрисовать на нем текст и строку 3) Согласно текущему смещению отрендерить путем Clipin-ga в методе OnRender на мой компонент . Вот ни как не найду нужные классы для пункта 2.. не подскажете ли? Видел пример с использованием Canvas, которая потом подается в RenderTargetBitmap , но что-то мне подсказывает, что это не правильный путь.... Это сообщение отредактировал(а) AleksPingvin - 24.5.2011, 21:19 |
|||
|
||||
DenWPF |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
Не понимаю в чем сложность. берете текст бокс убераете у него стили. строку в цикле по символу вызываете...
|
|||
|
||||
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
Мне не нужен текстбокс.
У меня бегущая строка со сложным фоном, пиктограммами и плавной (а не сдвиг по символу) анимацией. |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 13 Всего: 59 |
AleksPingvin, в моей реализации любой контент можно прокручивать, это подходит? Может седня вечером работы меньше будет, напишу.
-------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
-Mikle-, если она исполняет свою главную роль - текст бежит и можно использовать пиктограмки в нем, то да.
Впрочем все равно опишите идею, лишним не будет. А заодно пока не подскажете ли как все же для общего развития, как мне программно (а не загрузив из файла) создать изображение на котором я потом смогу программно отрисовать все что захочу ![]() |
|||
|
||||
DenWPF |
|
||||||||||||||||||||||||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
Я конечно не сильно понял, ну а такой вариант не подходит?
если нет, то есть пример того чего ты хочешь?
|
||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
Код не запускал, ибо на работе, но на сколько я вижу:
1) Бежит только текст. Я в третий раз говорю - нужно иметь возможность задавать в качестве объекта движения не только текст, но и пикторграммы. Например: Игра начинается в <пиктограма будильника> 12.00 бла бла бла. 2) Когда строка кончается, то дальше она идет заново не ожидая того, когда ее остаток дойдет до конца. Иными словами если строка "Привет, я дядя Степа!" и вся фраза не влазит в ширину строки, то будет выглядеть так: "вет, я дядя Степа! При" |
|||
|
||||
DenWPF |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
бежит не текст, а Label т.е Контрол, можно любой контрол так.
Сделай обертку с областью видимостью. ладно, пусть -Mikle- напишет как у него. |
|||
|
||||
-Mikle- |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 13 Всего: 59 |
Ну именно так и сделано у меня. Я решил смотреть в наш контрол и написать новый, но только изрядно урезанный вариант. Тем самым я и весь основной код не выложу (сохраню права на код), но в то же время то что требуется именно топикастеру реализую. В связи с копи-пастами из более навороченного контрола некоторая логика, возможно, будет излишней. Правьте сами, кому не нравится ![]() Контрол делался для силверлайта, но я не предвижу никаких проблем сделать то же самое на WPF. Итак... Создаем Templated Control и даем имя CreepLine. Студия нам создает CreepLine.cs и Generic.xaml (в нем будет определяться шаблон контрола). Далее меняем код класса на вот это:
Открываем Generic.xaml и находим там стиль для вновь созданного контрола. Редактируем его и приводим в такой вид:
Вот и все. Этот контрол выполняет нужную функцию, а именно, анимирует слева на право любой контент. Свойство IsEnabled говорит о том бежит ли контент или стоит. Свойство InitialDelay задает паузу, перед тем как контент начнет бежать (тут наверное лишнее для этой задачи). Вот пример использования:
Как видно, можно расположить абсолютно любой контент, с навороченными бэкграундами, фореграундами, форматированием, картинками, да хоть видеоролик сюда вставляй. -------------------- Если тебе плюют в спину, значит ты впереди... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
-Mikle-, супер! Попробую утром перекопипастить и потестить ваш компонент) Если возникнут вопросы - обязательно их задам
![]() Кстати а "выбег" содержимого начинается с краю или он сразу появляется а только потом начинает двигаться? |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 13 Всего: 59 |
Ну вот завтра и увидишь ![]() Не дорассказал еще про свойство PixelsPerSecondSpeed - оно задает скорость перемещения в пикселах (на сколько пикселов двинется контент за одну секунду), по умолчанию стоит 75. Свойства StartContentAtRight, EndContentAtLeft, EndContentAtRight и Duration - ридонли и служат для поддержки анимации в шаблоне контрола. Ну конечно задать значения этих свойств можно, только не из XAML. Да и незачем стремиться к этому, так как они все равно снова пересчитаются при любом изменении. В WPF можно объявить ридонли депенденси свойства и тогда они действительно будут ридонли, а сильверлайт пока не поддерживает такие. -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
AleksPingvin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 20.5.2011 Репутация: нет Всего: нет |
-Mikle-, ты меня убьешь... но моя VS 2010 не умеет создавать Template Control-ы... нет у нее такого пунктика( Вот User Control да)... я ее даже обновил и сдк поставил и нифига.
Это сообщение отредактировал(а) AleksPingvin - 26.5.2011, 07:13 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | WPF и Silverlight | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |