« first day (920 days earlier)      last day (2111 days later) » 

5:22 AM
@Bretbas в общем случае - никак, т.к. масштаб по X и по Y может отличаться, а линия может быть расположена по диагонали. Только если трансформировать линию на масштаб обратный масштабу трансформируемого родителя. Но тут проблема - определить центр трансформации...
Наверное, действительно, проще пересчитывать координаты вручную
 
6:07 AM
@АндрейNOP, >Но тут проблема - определить центр трансформации... Ну это проблему я решил, центр трансфорации я беру текущие координаты мыши
@VladD, >То есть для начала лучше не заморачиваться, и взять готовый контрол, если это можно. Вообщем качнул я Xamarin Profiler, нашел в нем 3 либы, которые пренадлежат Telerik'у. Подсоединил к своему проекту, и нашел RadTimeBar. То что нужно при первом виде на него. Дальше посмотрим. Буду разбираться
 
@Bretbas я имею ввиду, если мы будем каждую линию трансформировать на масштаб, обратный масштабу родителя, то нам для каждой этой линии придется определять центр трансформации (на самом деле он будет равен X-координате этой линии)
Если у нас линии строго горизонтальные/вертикальные, то можно просто разделить толщину линии на масштаб родителя. Но нужно где-то хранить оригинальную толщину, иначе меняя туда-сюда масштаб мы потеряем точность... Придется делать наследника контрола линии или поведение для нее с AttachedProperty
 
6:48 AM
@Bretbas, вот такое решение получилось. Написал поведение для линии:
    class ConstantThicknessLine : Behavior<Line>
    {
        public double StrokeThickness
        {
            get => (double)GetValue(StrokeThicknessProperty);
            set => SetValue(StrokeThicknessProperty, value);
        }

        public static readonly DependencyProperty StrokeThicknessProperty =
            DependencyProperty.Register(nameof(StrokeThickness), typeof(double),
                typeof(ConstantThicknessLine), new PropertyMetadata(1.0, UpdateLineThickness));

        public double Scale
Пример использования:
    <Grid>
        <Canvas>
            <Canvas.RenderTransform>
                <ScaleTransform x:Name="st"/>
            </Canvas.RenderTransform>
            <Line X1="10" X2="10" Y1="0" Y2="50" Stroke="Black">
                <i:Interaction.Behaviors>
                    <c:ConstantThicknessLine StrokeThickness="1" Scale="{Binding ElementName=st, Path=ScaleX}"/>
                </i:Interaction.Behaviors>
            </Line>
            <Line X1="20" X2="20" Y1="0" Y2="50" Stroke="Black"/>
        </Canvas>
private void Button_Click(object sender, RoutedEventArgs e)
{
    st.ScaleX += 1;
}
Наследовать нельзя - класс запечатан, поэтому через поведение
Для строго горизонтальных/вертикальных линий подойдет
Желаемую толщину линии задаем теперь в ConstantThicknessLine.StrokeThickness
А ConstantThicknessLine.Scale привязываем к ScaleTransform родителя
Для вертикальных линий к ScaleX, для горизонтальных к ScaleY, соответственно
Если пример запустите, можно увидеть, что при увеличении масштаба первая линия сохраняет свою толщину, а вторая - нет
 
7:05 AM
@АндрейNOP, ага:) Все фачит:) Спасибо:)
@АндрейNOP, но мне кажется, нужно посмотреть в сторону Telerik. Там в принципе все что нужно реализовано. Осталось разобраться в нем
@АндрейNOP, просто если действительно делать такой контрол - TimeBar, то мне нужно, чтобы он умел следующие вещи:
1. При маштабе должен происходить переход между годами/месяцы, месяцы/дни, дни/часы, часы/минуты. Я мог смотреть весь процесс, пролистывая его влево/право. Период времени должен обозначаться вверху, тоесть столбцы. А самые данные будут в строках. И у строк тоже должен быть Header, который не должен маштабироваться. Маштабируются только периоды и информация по времени(цветные полоски), которые находятся в рабочей области
 
@Bretbas ну конечно, если есть готовое решение - надо брать его. Я это просто, как бы в поддержку моего решения + академический интерес
 
2. Цветные полоски, которые обозначают промежутки времени должны определенным образом выравниваться. Я ими могу манипулировать - перемещать, увеличивать, потянув за края. Мог посмотреть промежуток между полосками и тд
@АндрейNOP, тоесть контрол действительно стоит денег. Он дофига должен уметь делать. И должен быть достаточно гибок. В основном, 80% задачи - это реализация этого контрола
 
да, возможностей в общем-то не мало, поведение сложное, однозначно надо брать готовый контрол
 
7:55 AM
@АндрейNOP, я скорее всего так и сделаю, так как в WPF я довольно слаб. Да и вообще, я только учусь во всем этом.
 
 
13 hours later…
8:58 PM
@Bretbas Ну и отлично. Писать собственный контрол не так уж сложно, но мороки многовато. И нужно API придумать.
Так что начинай с готового. будет время — напишем кастомный.
 

« first day (920 days earlier)      last day (2111 days later) »