Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/39: Рейтинг темы: голосов - 39, средняя оценка - 4.64
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376

Рисую линию без MVVM все ОК. C MVVM произвольный старт

30.10.2021, 12:59. Показов 9698. Ответов 148
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем.

Рисую линию при помощи анимации. Все получилось -рисуется, стирается.
Но у нас все задания с MVVM, чтобы ViewModel была
Хорошо добавил MVVM light, ViewModel создал, свойства, команду.

Блин, при запуске окна начала автоматически рисоваться линия.
Вообще должна с кнопки, как было ранее и планируется.

Как такое может быть, если никто и ничто не воздействует на свойство и должно быть false?
Или она сама по себе запускается. Так вся разница между двумя проектами - МVVM.

Xaml.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  <Window.Resources>
        <Storyboard x:Key="Storyboard.Draw2" x:Name="BeginStoryboardDraw2">
            <DoubleAnimation
                Storyboard.TargetProperty="X2"
                From="0"
                To="282"
                Duration="0:0:5" />
            <DoubleAnimation
                Storyboard.TargetProperty="Y2"
                From="0"
                To="11"
                Duration="0:0:5" />
        </Storyboard>
 
        <Storyboard x:Key="Storyboard.Erase2" x:Name="BeginStoryboardErase2">
            <DoubleAnimation
                Storyboard.TargetProperty="X1"
                From="0"
                To="282"
                Duration="0:0:5" />
            <DoubleAnimation
                Storyboard.TargetProperty="Y1"
                From="0"
                To="11"
                Duration="0:0:5" />
        </Storyboard>
    </Window.Resources>
 
    <Grid>
        <Canvas>
 
            <Line
                Name="MyLine3"
                Canvas.Left="100"
                Canvas.Top="100"
                Stroke="LimeGreen"
                StrokeThickness="6">
               
                <Line.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Animation_enable}" Value="true">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard x:Name="BeginStoryboardDraw2" Storyboard="{StaticResource Storyboard.Draw2}" />
                                </DataTrigger.EnterActions>
                                <DataTrigger.ExitActions>
                                   
                                </DataTrigger.ExitActions>
                            </DataTrigger>
 
                            <DataTrigger Binding="{Binding Animation_enable}" Value="false">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard x:Name="BeginStoryboardErase2" Storyboard="{StaticResource Storyboard.Erase2}" />
                                </DataTrigger.EnterActions>
                                <DataTrigger.ExitActions>
                                    <StopStoryboard BeginStoryboardName="BeginStoryboardErase2" />
                                </DataTrigger.ExitActions>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Line.Style>
            </Line>
 
        </Canvas>
 
        <Button
            Width="60"
            Height="20"
            Command="{Binding Launch_animation_command}"
            Content="Рисовать" />
 
</Grid>


VieModel

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 // Animation enable
 
        public bool Animation_enable
        {
            get { return _animation_enable; }
            set { Set(ref _animation_enable, value); }
        }
        private bool _animation_enable;
 
 
 
        // Command
        public ICommand Launch_animation_command { get; private set; }
 
 
        public MainWindowViewModel()
        {
 
            Launch_animation_command = new RelayCommand(LaunchAnimation);
 
 
        }
 
 
 
        // Method
        private void LaunchAnimation()
        {
 
 
            if (!Animation_enable)
            {
 
                Animation_enable = true;
 
            }
 
            else if (Animation_enable)
 
            {
 
 
               Animation_enable = false;
 
            }
 
 
 
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2021, 12:59
Ответы с готовыми решениями:

Доступ к View без нарушения правил MVVM
Здравствуйте, дорогие форумчане. Я недавно начал изучать MVVM. Вот недавно столкнулся с одной проблемой: как мне , допустим, создать...

Привязка данных без использования паттерна MVVM
Здраствуйте, интересует вопрос как сделать такую привязку. Имеется класс Game.cs: class Game: DependencyObject { ...

MVVM
Здравствуйте, я в среде WPF нахожусь очень мало, посмотрел книжки, решил читать Мэтью Макдональда, стоит ли мне сразу изучать MVVM или...

148
28 / 16 / 2
Регистрация: 09.05.2020
Сообщений: 149
02.11.2021, 23:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как я могу сказать не знаю в каком пространстве вы его объявили?
вы не поняли, если datacontext идет таким образом

XML
1
2
3
4
 
        <Window.DataContext>
        <Binding Path="_MainWindowViewModel" Source="{StaticResource locator}" />
        </Window.DataContext>
то зачем мне vm: ???

как в таком случае мне поступить с

XML
1
<DataTemplate x:Key="Portion.Template" DataType="{x:Type vm:Portion}">
или это никак не связано с datacontext?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
02.11.2021, 23:55
Цитата Сообщение от Nguen Посмотреть сообщение
вы не поняли, если datacontext идет таким образом
Я прекрасно понял!
Но Контекст Данных не имеет никакого отношения к префиксам имён.

Шаблон данных вы задаёте для какого-то типа.
В XAML нет юсингов как в Шарпе.
Поэтому для пространства имён надо задать префикс и потом уже через префикс тип в этом пространстве имён.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
03.11.2021, 11:02  [ТС]
Элд Хасп,
гениально.

Nguen, не сдирай XAML один к одному!
1
28 / 16 / 2
Регистрация: 09.05.2020
Сообщений: 149
03.11.2021, 12:05
Элд Хасп, великолепно!

вопросы,

а) а что такое speed в нашем случае?
б) свойства speed и length принципиально должны быть double?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
03.11.2021, 12:13
Цитата Сообщение от Nguen Посмотреть сообщение
а) а что такое speed в нашем случае?
На сколько единиц (пикселей) в секунду перемещается материал.

Цитата Сообщение от Nguen Посмотреть сообщение
б) свойства speed и length принципиально должны быть double?
Не принципиально.
Но в GUI они используются для задания смещения Convas.Top и координаты Line.X2.
И то и другое - имеют тип double.
Поэтому double - самое оптимальное.
0
28 / 16 / 2
Регистрация: 09.05.2020
Сообщений: 149
03.11.2021, 12:26
Цитата Сообщение от Элд Хасп Посмотреть сообщение
На сколько единиц (пикселей) в секунду перемещается материал.
то есть т.к. писель величина неделимая, то скорость 0.5 не даст визуального эффекта? Минимальная =1?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
03.11.2021, 13:19
Цитата Сообщение от Nguen Посмотреть сообщение
писель величина неделимая, то скорость 0.5 не даст визуального эффекта? Минимальная =1?
Это же не физические пиксели, а виртуальные WPF.
В физические их преобразует уже внутренняя структура WPF и для разных физических устройств для одного и того же значение пикселей WPF вы можете получить разное количество физических пикселей.

В общем вам это не нужно.
Достаточно того, что для WPF всё задаётся через double значения и любой другой тип придётся дополнительно кастовать к double.
1
28 / 16 / 2
Регистрация: 09.05.2020
Сообщений: 149
04.11.2021, 21:38
Элд Хасп,

вы устанавливали значение свойств ConveyorLength, Speed так:
XML
1
2
3
        <Window.DataContext>
        <vm:MainWindowViewModel ConveyorLength="800" Speed="50" />
        </Window.DataContext>
а мне как быть если у меня так:

XML
1
2
3
        <Window.DataContext>
        <Binding Path="_MainWindowViewModel" Source="{StaticResource locator}" />
        </Window.DataContext>
они не находятся.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 22:41
Цитата Сообщение от Nguen Посмотреть сообщение
они не находятся.
В XAML просто задать значения свойств при инициализации.
Задать значение уже существующему объекту достаточно не просто.
Требуется разные выкрутасы: Behavior, AP-свойства, Прокси и т.п.

Где у вас задаётся значение свойству locator._MainWindowViewModel?
Проще всего будет сделать это там, но зависит ещё и от реализации локатора.
Если он из MVVMLight, то придётся менять его реализацию.
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
15.11.2021, 13:56  [ТС]
Элд Хасп,
заметил вы "подымаете" методы во таким образом,


C#
1
2
3
4
5
6
7
8
        public override void RaisePropertyChanged<T>([CallerMemberName] string propertyName = null, T oldValue = default, T  newValue =    default, bool broadcast = false)
        {
            base.RaisePropertyChanged(propertyName, oldValue, newValue, broadcast);
 
            if (propertyName == nameof(IsMaterialsReceiving))
            {
                      // do smth
            }


на показывают такой,

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 public override void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
 
            base.RaisePropertyChanged(propertyName);
 
           
            if (propertyName == nameof(IsMaterialsReceiving) && IsMaterialsReceiving)
            {
 
                // do smth
 
 
            }


оба способа работают.

т.к. в вашем "накручено" больше, плиз поясните преимущества первого и недостатки второго.

Спасибо.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.11.2021, 14:28
Цитата Сообщение от Berendom Посмотреть сообщение
т.к. в вашем "накручено" больше, плиз поясните преимущества первого и недостатки второго.
Это не "преимущества и недостатки", а разная логика.

В первом случае тело условия срабатывает при любом изменении свойства IsMaterialsReceiving.
Во втором случае, только если IsMaterialsReceiving было изменено с false на true.
При обратном изменении тело условия не будет исполняться.

Вторую логику можно реализовать ещё и так:

C#
1
2
3
4
5
6
7
8
        public override void RaisePropertyChanged<T>([CallerMemberName] string propertyName = null, T oldValue = default, T  newValue =    default, bool broadcast = false)
        {
            base.RaisePropertyChanged(propertyName, oldValue, newValue, broadcast);
 
            if (propertyName == nameof(IsMaterialsReceiving) && (bool) newValue)
            {
                      // do smth
            }
Или так (для понимания разнёс проверки условий):
C#
1
2
3
4
5
6
7
8
9
10
11
        public override void RaisePropertyChanged<T>([CallerMemberName] string propertyName = null, T oldValue = default, T  newValue =    default, bool broadcast = false)
        {
            base.RaisePropertyChanged(propertyName, oldValue, newValue, broadcast);
 
            if (propertyName == nameof(IsMaterialsReceiving))
            {
                if ((bool) newValue)
                {
                      // do smth
                }
            }
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
15.11.2021, 14:45  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это не "преимущества и недостатки", а разная логика.
вы же еще делаете вот так,

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public override void RaisePropertyChanged<T>([CallerMemberName] string propertyName = null, T oldValue = default, T  newValue =    default, bool broadcast = false)
        {
            base.RaisePropertyChanged(propertyName, oldValue, newValue, broadcast);
 
            else if (propertyName == nameof(IsConveyorRunning))
            {
 
                if (Equals(newValue, true))
                {
                     // do smth
                }
 
             
            }
 
          }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.11.2021, 18:50
Цитата Сообщение от Berendom Посмотреть сообщение
вы же еще делаете вот так,
По логике внутреннее условие (в данном случае) эквивалентно if ((bool) newValue).
А условия разделены, чтобы во внешнем if-elseif уменьшить количество проверок.
На новом Шарпе внешний if-elseif можно заменить на switch.
1
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
19.11.2021, 19:47  [ТС]
Элд Хасп, добрый вечер,

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<ToggleButton
                Margin="10"
                Padding="15,5"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                DockPanel.Dock="Right"
                IsChecked="{Binding IsConveyorRunning}">
                <ToggleButton.Style>
                    <Style TargetType="ToggleButton">
                        <Setter Property="Background" Value="WhiteSmoke"/>
                        <Setter Property="Content" Value="Конвейер Cтарт" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsConveyorRunning}" Value="True">
                                <Setter Property="Content" Value="Конвейер Стоп" />
                                <Setter Property="Background" Value="Green"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ToggleButton.Style>
            </ToggleButton>
Добавил дефолтные сеттеры, и к дата-триггеру тоже, чтобы togglebutton цвет меняла с WhiteSmoke на Green. Ноль эмоций! Игнорирует.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
19.11.2021, 20:35
Цитата Сообщение от Berendom Посмотреть сообщение
Ноль эмоций! Игнорирует.
Сделайте фиксацию - посмотрю.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
19.11.2021, 21:32  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сделайте фиксацию - посмотрю.
этот ГитХуб - "убийство" какое-то, все время забываю как "вливать, "выливать". Наверное нужно отдельно пять лет на него учиться, с отдельным дипломом.

Перезалил целиком с изменениями. Как фиксацию делать, "в душе не знаю".
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
19.11.2021, 21:40
Цитата Сообщение от Berendom Посмотреть сообщение
Как фиксацию делать, "в душе не знаю".
Снизу Студии синяя статус строка.
Справа справ на ней кнопки управления Гитом.
Одна из них "карандаш" - количество внесённых изменений.
Кликаете по ней - открывается панель изменений.
Набираете там сообщение фиксации и кнопку "Зафиксировать всё и отправить".

Ничего сложного.

Добавлено через 2 минуты
Цитата Сообщение от Berendom Посмотреть сообщение
Перезалил целиком с изменениями.
Git пустой.
Ветка которую я создал - без изменений.
Ветка "main" - там всё удалено.
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
19.11.2021, 21:42  [ТС]
пр
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Git пустой.
перезалейте с него по новой.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
19.11.2021, 21:51
Цитата Сообщение от Berendom Посмотреть сообщение
этот ГитХуб - "убийство" какое-то, все время забываю как "вливать, "выливать"
Чё-то вы там конкретное натворили...

Какаяа-то каша - локально клонируются два репозитория.
Отдельные для вашей и моей ветки.

Добавлено через 3 минуты
Вроде разобрался с клонированием.

Добавлено через 2 минуты
Berendom, вы случаем не "руками" в Web интерфейсе заливаете?
Почему у вас в реп попала куча не нужных файлов и папок, которые не должны были пройти через игнорирование?
0
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376
19.11.2021, 21:54  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вроде разобрался с клонированием.
нужно у себя в директории все файлы .git удалить. И по новой за
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Berendom, вы случаем не "руками" в Web интерфейсе заливаете?
Почему у вас в реп попала куча не нужных файлов и папок, которые не должны были пройти через игнорирование?
а хз. Через гитхуб десктор. Может где галочка не стоит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2021, 21:54

Mvvm
Форумчане помогите разобраться есть простенькая модель public partial class Category:ViewModelBase { private int...

MVVM
Добрый день! Пытаюсь написать программу в стиле MVVM. Вопрос такой: как передать SelectedItem TreeView из xaml с помощью Binding в...

MVVM
Объясните пожалуйста следующие строки 1)Представление является подписчиком на событие изменения значений свойств или команд,...

x:Name в MVVM
Добрый день, как обращаться к объектам из VM по их x:Name? Например, у меня есть канвас в который я докидываю картинки по нажатию...

MVVM: модель?
Что это вообще такое в рамках реализации тонкого клиента? Полное текущее состояние клиентского приложения? Серверная часть не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru