|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
WPF TimeLine поля07.08.2020, 07:18. Показов 3482. Ответов 56
На просторах интернетов заметил интересную тему и решил её раскрутить, ибо показалась мне сложной .
Задача состоит в том, чтобы сделать аналог полей в видеоредакторах. Почему эта тема сразу показалась мне сложной? — если до этого я работал с объектами и не более, то сейчас я даже не могу понять с чем мне работать. 1. Вверху должена быть 24 часовая полоса с делениями часового диапазона(Первый UC). И хорошо, если пользователь оставил свой видос вначале , но если он 5-ти секундный видос захочет переместить на 20 000 попугаев вправо(относительно лева), то тогда в оперативу загрузится 5 тысяч таких часовых полосок(UserControl'ов). Думаю кулер начнёт орать на всю комнату, что тебе пора выключать компутатор, или он позовёт своего соседа Экрана Синевицкого. Следовательно, как я прикинул, в ходе должно участвовать, допустим, 3 таких UserControl'ов, которые будут меняться друг за другом создавая эдакую иллюзию множества. 2. Допустим, но тут у меня сразу появляется вопрос об взаимодействии с событием Scroll. В интернетах я, в рамках своей неопытности видать, не нашёл много информации о ScrollBar'е. Я пытался при изменении его Value создать и подключить событие, которое будет менять значение положения примитивному прямоугольнику. Как я только не танцевал с бубном а всё равно ничего не получилось. Подытожу: должно быть 2 UserControl'a — часовая шкала и сам прямоугольник, которые меняют своё положение и уходят за границы экрана в следствии передвижения ползунка ScrollBar'a. Они не просто должны уходить за рамки, а и перемещаться за рамки с противоположной стороны экрана и менять свой размер длины(продолжительности минут "видеоролика"). Информацию разместил на просторах GitHub: http://github.com/limeniye/xsenio Буду обновлять по мере каких-то результатов(которые будут, если меня подтолкнут).
0
|
|
| 07.08.2020, 07:18 | |
|
Ответы с готовыми решениями:
56
Не понял как прикрутить timeline Создать конструктор класса TimeLine с параметрами
|
|
Модератор
|
|||
| 12.08.2020, 16:43 | |||
|
В любом случае, это просто временный, локальный вариант, так как я не знаю откуда вы берёте исходные данные. Добавлено через 54 секунды Но разве нам нужен любой?
0
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 12.08.2020, 16:46 [ТС] | ||
![]() Ох, я что-то там действительно напортачил. Сейчас переделаю .
0
|
||
|
Модератор
|
||
| 12.08.2020, 16:55 | ||
|
Давайте, сначала по структуре и источнику самих исходных данных.
Общую структуру я представляю как коллекцию полос. В каждой полосе коллекция сегментов и ещё какие-то дополнительные атрибуты (имя и т.п.) Всё что нам нужно в модели - это ОДИН метод который возвращает коллекцию полос с сегментами для указанного диапазона. Чтобы не загружать задачу по ОТОБРАЖЕНИЮ коллекции полос, я не стал рассматривать вопрос получения исходных данных. Это не столь важно (для этой задачи) и сделаете уже сами. Поэтому в упрощённом виде, сделал внешний источник в удобном для редактировании виде. В каком виде удобнее редактировать данные: в XML или JSON ? В JSON намного проще сделать ошибку при "ручном" редактировании. И потом будут непонятные ошибки. Поэтому я и выбрал (для временного решения) XML-файл. Добавлено через 58 секунд Просто задаю вопросы, чтобы вы задумались. Добавлено через 2 минуты JsonSerializer - должен решать задачу считывания любых данных, судя по его интерфейсам. Но с одной стороны он не решает такую задачу, а с другой эта задача никак не связана с тем, что нам нужно. Нам нужно считать конкретный тип с данными и всё. Никакого обобщённого решения нам не нужно.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
| 12.08.2020, 18:10 [ТС] | |||||||||||
|
Элд Хасп,
0
|
|||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 12.08.2020, 19:16 [ТС] | |
|
Подключался.
Добавлено через 31 секунду Обращение к Элд Хасп.
0
|
|
|
Модератор
|
||||||||||||||||||||||||||||||||
| 12.08.2020, 20:29 | ||||||||||||||||||||||||||||||||
|
Описываю пошагово.
1) Структуру файла данных слегка изменил:
"Причесал" их:
В первом StripsModel - Repos.cs конструктор и метод загрузки данных:
StripsModel - GetCollectionl.cs метод фильтрации и конвертации данных:
StripsModel - Async Methods.cs асинхронные оболочки для синхронных методов:
Если разберётесь сами проверьте работу хотя бы синхронных методов. Фиксация 3c5ca049 от 12.08.2020 20:28:48:
0
|
||||||||||||||||||||||||||||||||
|
Модератор
|
||||||||||||||||||||||
| 13.08.2020, 13:45 | ||||||||||||||||||||||
|
limeniye, начинаем создавать View.
Начнём с контрола для одной полосы. 1) Создаём UserControl с именем StripUC. Вообще-то, по феншую здесь напрашивается Custom Control, но в дебри пока не будем вдаваться. Для начала нам нужно только одно свойство принимающее последовательность Сегментов:
для Сегмента - жёлтый прямоугольник: высотой как Контрол, длиной из свойства Length Сегмента; для панели элементов - Canvas размерами как Контрол и с обрезкой элементов выступающих за границы; для стиля элемента - привязку смещения влево к свойство Begin Сегмента. Контрол содержит только один элемент - ItemsControl.
Фиксация b50b9908 13.08.2020 13:44:51
0
|
||||||||||||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 13.08.2020, 14:55 [ТС] | |
|
Элд Хасп,
Меня немного до сих пор, всё же, смущает этот Range. Вы указываете диапазон как SegmentDto. Сейчас то я уже понимаю что так Вы задаёте рамки видимого диапазона, но всё же это не сегмент. Если я не ошибаюсь, то Cat и Dog это не одно и то же. Приведу пример. Допустим я хочу добавить строку, о которой я писал давно: public Color Background {get;}. И тогда видимый диапазон будет содержать ненужную информацию цвета. Я новичок и не хочу придираться, но мне кажется там должен быть класс наследник, или что-то типо такого. Вообще я слышал что наследование это очень плохо, потому что задаёт "жесткую привязку". Отпишите, пожалуйста, что-то по этому пункту, а точней, что я не так понимаю.
0
|
|
|
Модератор
|
||||
| 13.08.2020, 15:34 | ||||
|
Это участок от и до. Могут ли в участке быть другие сегменты? Конечно. Поэтому, на взгляд использование для Range типа Сегмента, вполне корректно. Я тоже новичок. Могу чего не так сделать или понять. Это всё таки функция View. Может можно задать некий Контент по которому View будет выбирать тот или иной цвет. Но пока не понимаю для чего вы это хотите задать, поэтому детальней ответить не могу.
0
|
||||
|
Модератор
|
||||||||||||||||||||||||||||||||
| 13.08.2020, 17:53 | ||||||||||||||||||||||||||||||||
|
limeniye, продолжаем.
1) Полоса это у нас не только последовательность Сегментов, но и имя, Диапазон, возможно в будущем ещё и какой-то Контент. Поэтому для полосы надо создать свой тип. В этом типе надо предусмотреть обновление данных из типа StripDto:
- у Сегментов абсолютные значения, а нам надо отображать относительно начала Диапазона. - масштаб отображения у нас сейчас абсолютный. А нам надо такой который автоматически привяжет длину Диапазона к ширине контрола. Сделаем для этого два конвертера. Один преобразует длину Сегментов:
Фиксация 56c37281 от 13.08.2020 17:52:41
0
|
||||||||||||||||||||||||||||||||
|
Модератор
|
|||||||||||||||||||||||||||
| 14.08.2020, 09:13 | |||||||||||||||||||||||||||
|
limeniye, создаём контрол для отображения списка полос.
Много описывать не буду. Делается примерно также как предыдущий.
Можно немного изменить создание списка в XAML
Теперь надо приступить к созданию View с возможностью промотки. Изначально планировалось проматывать скруллом. Но возникает вопрос по Thumb, а это основной элемент скрулла. Надо задать Thumb размер и положение. Подразумевается, что размер Thumb - это пропорциональный размер отображаемого участка к ко всему возможному диапазону. Но возможный диапазон в задаче - бесконечность.... А положение Thumb - отражается относительно положения в возможном диапазоне. Поэтому надо придумать какой-то алгоритм подходящий для задачи для определения размера и положения Thumb. После этого можно будет задать ему события и по ним изменять диапазон отображения Полос. Так, что limeniye - думайте над алгоритмом.
0
|
|||||||||||||||||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||||||||||
| 16.08.2020, 16:20 [ТС] | |||||||||||||||||||||
|
Элд Хасп, пытаюсь добавить TimeBar по примеру, но первым блин -- комом.
1. Создал этой полосе свой лист class TimerBarList : List<Strip> { }2. Создал TimerBarUC и в Xaml изменил просто цвет с жёлтого на зелёный, для примера.
4. Добавил в StripsUC.xaml
Элд Хасп, и чем глубже я пытаюсь повторить Ваш код, тем больше копипаста у меня получает. По всей сути у меня должен быть в итоге 1 компонент с строками и сегментами и с строкой и TimerBar'ами, а итоге у меня получается 2 разных компонента с куча одинаковых классов только для того, чтобы сделать немного другую реализацию
0
|
|||||||||||||||||||||
|
Модератор
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 16.08.2020, 17:23 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
limeniye, я закончу свой пример сначала.
Так как с размером не определились, то пока я его буду задавать из XML
Добавляем Модель в ViewModel
Фиксация dd42034d от 16.08.2020 17:18:05
На данный момент не реализована поддержка промотки захватом Thumb мышью. Но лезть в дебри, пока не вижу необходимости. Добавлено через 2 минуты Код лаконичный, хорошо структурированный. А что в нём менять? Только название типов, переменных?
0
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
| 17.08.2020, 01:43 [ТС] | |||||||||||
|
Элд Хасп, по поводу вытягивания данных из .xml файла -- зачем это делать, когда проще сгенерировать?
Простой пример генерации листа сегментов:
0
|
|||||||||||
|
Модератор
|
||
| 17.08.2020, 09:18 | ||
|
Во-вторых, можно, конечно и генерить, но мне для отладки проще сразу десериализовать RootXml - это всего две-три строки кода.
0
|
||
|
Модератор
|
||
| 17.08.2020, 15:48 | ||
|
limeniye, доделал поддержку перемещения ползунка мышью.
Фиксация 9e85d75a от 17.08.2020 15:47:10
0
|
||
| 17.08.2020, 15:48 | |
|
Помогаю со студенческими работами здесь
57
Невозможно выполнить выборку по имени поля (по номеру поля все работает) Передача поля в контроллер из вьюшки без пападания поля во вьюшку Заполнение базы данных с определенного номера поля ключевого поля как сделать Поля таблицы на русском и скрыть поля счетчик в windows forms При достижении края поля объект должен перерисовываться с противоположной стороны поля Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
|
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|