1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
1 | |
WPF TimeLine поля07.08.2020, 07:18. Показов 2549. Ответов 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 с параметрами WPF Binding поля, в качестве поля - объекта класса Невозможно выполнить выборку по имени поля (по номеру поля все работает) |
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
07.08.2020, 07:24 [ТС] | 3 |
Выглядеть примерно так. Но при при перемещении ползунка ничего не произойдёт(ссылку обновил на гитхаб), а должно приперемещении ползунка вправо — эти ораньжевые прямоугольники смещаться влево.
0
|
Модератор
|
|
07.08.2020, 08:00 | 4 |
Первое что в голову приходит - Обрабатывать события скрула.
В VM задать отображаемый диапазон: начало и конец. И коллекция попадающих в этот диапазон элементов. У каждого элемента свойства для привязки: ширина и цвет. Расчёт коллекции должен происходить автоматически при изменении диапазона. По события скрула - изменяются границы диапазона. Можно ещё добавить масштабирование по которому будет изменять размер диапазона. Добавлено через 5 минут Можно ещё попробовать использовать ListBox с отключенным элементами (если не нужна возможность их выбора). В ListBox встроена виртуализация, и он загружает только видимые элементы. Но прокрутка в ListBox идёт поэлементная, а не плавная. Возможно это можно настроить, надо посмотреть. В том числе, надо попробовать отключить в ListBox встроенный скрул, а сам ListBox поместить целиком во внешний скрул.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||||||||||||
07.08.2020, 11:55 [ТС] | 5 | |||||||||||||||||||||||||
_______________________
Сейчас покажу как я уже пытался такое сделать. Класс, на данный момент, выглядит вот так:
_______
0
|
Модератор
|
|||||||
07.08.2020, 13:34 | 6 | ||||||
limeniye, по пользованию редактором:
Добавлено через 7 минут Если Scrolling - это свойство-команда реализация которого показана выше, то должна быть привязка ...="{Binding Scrolling}" .НО! Что это за свойство такое ScrollBar.Scroll ? У ScrollBar, вроде, нет такого свойства.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
07.08.2020, 13:58 [ТС] | 7 |
мне высвечивает такое свойство само, но что это такое я не понимаю. В интернете искал — не нашёл. Методом ТЫКА и логики именований решил, что это свойство скроллинга у него.
0
|
Модератор
|
|
07.08.2020, 14:02 | 8 |
Блин!
Это же событие! К нему нельзя задать привязку, но передать делегат обработчика. Связь с VM - неоднозначна. Добавлено через 2 минуты limeniye, тут надо не просто общие советы, а сидеть кодить. Не сказать что сложно, но кода будет много. Первая (верхняя) полоска что у вас отображает? Это яно не то что вы написали.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
07.08.2020, 18:28 [ТС] | 9 | |||||
Элд Хасп, Ох, так на столько всё ужасно?
Я думал там пару строк для связки с ScrollBar и дальше я бы пытался сделать что-то типо: "если прямоугольник вышел за рамки видимого диапазона, тогда он может взять свойства (начальной точки и конечной точки) следующего прямоугольника". Этот пример взят из просторов интернета. ______________________________________________ Я попробую реализовать это +- так, как Вы показывали(просьба не закидывать меня помидорами). 1. Как полоса часового диапазона (нет, она не сделана, потом сделаю, пока не важно), так и прямоугольные примитивы имеют схожие действия: они должны менять своё положение в зависимости от того, если они не в зоне видимости(а точней, они должны телепортироваться), а также они должны перемещаться в рамках видимости(но просто перемещаться, а не телепортироваться, на рисунке будет показано о чём я говорю). Для этого буду отслеживать Visible элемент, или Unvisible. В примере ниже я также создал ещё такое событие как "ЧастичнаяВидимость". Данное событие лишнее и только уменьшает скорость, но я хотел бы чтобы оно всё же пока побыло. Дело в том, что для примитивной демонстрации я хочу в TextBlock, в итоге, выводить состояние первого элемента: "Элемент пропал из зоны видимости в левую сторону", "Элемент пропал из зоны видимости в праву сторону", "Элемент частично за рамками видимости", "Элемент виден".
И так мой криворукий и "наглядный" скрин: За рамками видимости будет 1 прямоугольник, который будет находиться либо слева за рамкой, либо справа. Он будет телепортироваться с стороны на сторону в зависимости от того, какая точка будет ближе, чтобы когда подвести ScrollBar'ои эту точку ещё ближе к зоне видимости, прямоугольник был уже готов заранее. То есть это типо предугадывание поведения пользователя и подготовка элемента ДО появления. Подытожу: две точки за рамками видимости и какая точка ближе к зоне видимости, свойства той точки и будет принимать прямоугольник.
0
|
Модератор
|
|
07.08.2020, 18:43 | 10 |
Не ужасно, а просто много кода, хоть и не сказать что он будет сложный.
Давайте для начала определимся с самой задачей. Вернёмся к рисунку из третьего поста: 1) Что это за две линии вверху? Между ними есть связь или нет? 2) Цвет каждого сегмента имеет какое-то заданное значение или это просто любые два цвета поочерёдно применяемые к сегментам? 3) Доп к п.2. Если поочерёдно, то как определяется чья очередь? Какой цвет первый? С учётом того, что это только часть условно бесконечной линии. 4) Так как мы работаем с диапазонами, то можно ли все исходные данные представить как отсортированную последовательность double ? 5) Будет ли масштабирование? Изменение выводимого промежутка? Добавлено через 3 минуты 6) Какие требования к точности и диапазону исходных данных? Надо выбрать их тип. double самый простой в работе (для данной задачи), но у него могут быть проблемы с точностью при очень больших диапазонах. Поэтому, может быть стоить выбрать один из: int, long или decimal. Если знак не нужен, то ещё можно и uint или ulong.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
07.08.2020, 19:05 [ТС] | 11 | ||||||||||
Элд Хасп,
1. Две эти линии это
3. Очередь, в первом примере, определяется начальной точкой и конечной каждого элемента, которые имеют не координаты, а (часы,минуты,секунды). 4. Ммм, не совсем понимаю вопрос. Оно должно вообще генерировать какой-то диапазон, например 20 000 элементов с разными начальными и конечными точками в диапазоне от минуты до 10, например. И когда ScrollBar перемещается — перебираются элементы из какого-то массива. Тогда да, он должен быть отсортирован: то если ползунок ScrollBar'a находится по середине, то и в массиве пользователь должен быть посередине . 5. Каждый массив можно сгенерировать по новой и,например, двигать элементы не нужно. Но вы писали о том, что можно сделать через ListBox, но тогда нельзя будет возможность перемещать элементы, а я бы хотел всё-таки посмотреть, как бы это выглядело без него с перемещением. 6. Вообще я хотел через double, чтобы был более точный просчёт. Добавлено через 3 минуты Также хотел бы уточнить, что генерируются "якобы" 20 000 прямоугольников, а на самом то деле их 5, просто они перемещаются и делают иллюзию что каждый раз это новый прямоугольник.
0
|
Модератор
|
|
07.08.2020, 20:14 | 12 |
Насколько понял, это две независимые коллекции, но с одинаковым отображаемым диапазоном.
Это понял. Значит у нас есть для каждого сегмента: начало и его длина. Могут ли сегменты накладываться? Если не могут, но придут такие данные, что делать? Отобразить как пришли, или проверять на ошибку и выдавать исключение? Это не правильно. В общем виде - это числовая задача. А исходные данные (допустим, время) надо предварительно приводить к числам. Для TimeSpan - это Total... Это я не правильно понял. Сейчас изменяю вопрос. У нас есть две коллекции. В каждой коллекции элементы со свойствами: начало и длина. Обе коллекции отсортированы по свойству "начало". Я здесь вижу такую реализацию. Есть входные коллекции. Есть выходные коллекции для привязки. Задавая диапазон - мы проецируем исходные коллекции на коллекции для отображения. В исходных коллекциях начало задаётся в абсолютных единицах, в коллекция для отображения - относительно начала отображаемого диапазона. Масштабирование. У нас есть какие-то условные единицы. Эти условные единицы совершенно не связаны с экранными единицами. А для UI элементов нужны экранные единицы. Допустим, мы считаем в минутах и у нас диапазон - один час, то есть 60 минут. Но выводим мы на ширину 1100. Следовательно нужно масштабирование от 60 к 1100. Это можно делать средствами WPF. Используется ViewBox. Но при больших коэффициентах масштаба могут проявиться баги разрешения. Можно это делать программно, но тогда появляется задача передачи значения ширины (UI диапазона) в наш класс для его обработки. Работать будет лучше, но добавится кода как при реализации так и при использовании. Здесь у вас пробел в знаниях основ C#. Double - неточный тип. У него самый большой ДИАПАЗОН значений, но точность его ограничена 52 двоичными знаками. У ulong - 64 двоичных разряда. У decimal - 96 двоичных разрядов. Если исходные данные поступают из TimeSpan , то свойства Total... возвращают double . Поэтому лучше, на мой взгляд, на нём и остановиться. Угу. Это я понял. Будет некий абстрактный метод запрашивающий данные для указанного диапазона, и метод будет возвращать коллекцию элементов "начало и длина".
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||||||||||||
07.08.2020, 23:02 [ТС] | 13 | |||||||||||||||||||||||||
Элд Хасп,
Сообщение от Элд Хасп
_______________________________________________________________ По поводу сортировки массива. Просто я представлял не так всё и массив не нужно было бы сортировать. Но поразмыслив часа пол, мне кажется что это всё таки будет разумнее и проще. _______________________________________________________________
Сообщение от Элд Хасп
У меня есть такая строка
_______________________________________________________________
Сообщение от Элд Хасп
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
08.08.2020, 12:33 [ТС] | 15 |
Я просто не дома, а компилирую и дорабатываю всё ночью у друга на ноуте через Team Viewer, пока он спит.
Компа нет(в данный момент), а задание всё равно хочу понять, ибо оно для меня тяжёлое и поняв его, мой скилл апнется. Компа нет, а прогрессировать хочется, поэтому вручную ставлю каждые пробелы табуляции ) Добавлено через 5 минут Это конечно очень долго и сложнее, но это лучше чем сидеть дома в Коронавирус и ничем не заниматься как Амёба, или Инфузория Туфелька Добавлено через 1 минуту Элд Хасп, Забыл Вас ответить
0
|
Модератор
|
|
08.08.2020, 13:10 | 16 |
УЖАС!!! Сочувствую. А в аренду не найти? Хоть простенький? Вам же для Студии любой подойдёт. Киньте клич по соцсетям, наверняка у кого-то, дома неиспользуемое старьё валяется, пылится. Может и откликнется кто-нибудь.
0
|
Модератор
|
||||||
08.08.2020, 15:02 | 17 | |||||
Теперь по коду.
1) DTO - это: То есть у него все свойства "Только Для Чтения". Ваш тип ElementDto явно не соответствует этому определению.Поэтому назовём его StripSegment .Так же его свойства предназначены джля привязки в WPF View, поэтому сделаем производным от: Новая реализация OnPropertyChangedClass [WPF, Элд Хасп] 2) Какие свойства нужны у этого типа? Начало и Конец - это ясно. Но нам в View потребуется ещё и задать ширину элементам представляющим Сегмент. Поэтому нужна ещё Длина. Так же нужно автоматическое вычисление значений зависимых свойств. Пример реализации:
В нём есть проект Common .Я его перекинул из другого Решения. В нём типы которые могут пригодиться, чтобы не делать их реализацию каждый раз заново.
0
|
Модератор
|
|
08.08.2020, 15:14 | 18 |
Дальше нам нужен тип получающий на вход коллекцию исходных данных.
Вот здесь у меня нет понимания. Это может быть отсортированная коллекция StripSegmentsDto (только два иммутабельных свойства Начало и Конец). Тогда нужно автоматически отслеживать изменения этой коллекции. И откуда она приходит? Или метод получающий в параметрах StripSegmentsDto задающий диапазон отображения и возвращающий отсортированную коллекцию StripSegmentsDto. Как вы это видите?
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
08.08.2020, 15:16 [ТС] | 19 |
Элд Хасп, я тут переписал всё, через минут 20 кину. Посмотрите?
0
|
Модератор
|
|
08.08.2020, 15:20 | 20 |
По-моему, это излишне.
Для чего свойство с этим типом? Если использовать его для элементов коллекции предназначенной для отображения - есть всё равно риск перегрузки GUI. Слишком большая коллекция. Лучше сделать фильтрацию элементов из исходной коллекции в коллекцию предназначенную для отображения. В отфильтрованной коллекции будет очень мало элементов, и ни какого риска перегрузки GUI. Добавлено через 21 секунду Конечно.
0
|
08.08.2020, 15:20 | |
08.08.2020, 15:20 | |
Помогаю со студенческими работами здесь
20
Передача поля в контроллер из вьюшки без пападания поля во вьюшку Заполнение базы данных с определенного номера поля ключевого поля как сделать Поля таблицы на русском и скрыть поля счетчик в windows forms При достижении края поля объект должен перерисовываться с противоположной стороны поля Данные в combobox одного поля, заменить значением другого поля при сохранении в файл базы Описать класс студент, имеющий три поля предметов и 3 целочисленных поля – баллы, набранные по этим предметам Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |