Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
1

[WPF] Использование OxyPlot не очищает график

12.03.2017, 21:03. Показов 2833. Ответов 15
Метки нет (Все метки)

Добрый день. Имею следующий код :

C#
1
<oxy:PlotView Model="{Binding MyModel}" Height="500" Width="640" Background="Transparent" Grid.Column="0" Margin="10,10,151,76" />

Затем я инициализирую модель. Заполняю её точками. Всё суппер всё появляется на графике. Затем я хочу обнулить все точки. Показать пустой график без точек.


C#
1
MyModel.Points.Clear();

И далее как советуют в гугле пытаюсь обновить график.


C#
1
2
3
4
Application.Current.Dispatcher.Invoke(() =>
{
MyModel.InvalidatePlot(true);
});

Но график не обновляется. Если продебагать то в момент MyModel.InvalidatePlot(true); у него действительно все точки потёрлись. Но тем не менее график не обновляется. Подскажите как обновить.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2017, 21:03
Ответы с готовыми решениями:

Работа с OxyPlot wpf
Подскажите, как закрасить область, ограниченную графиком. Я использую OxyPlot.

OxyPlot в WPF непонятно как указывать данные
Добрый день! Прошу прощения, но сечас будет, наверное простой, но тем не менее непонятный для...

График (C# и WPF)
Нужно нарисовать график, но не знаю каким способом лучше всего сделать. Программа с графиком...

WPF и Curve график
Коллеги, подскажите пожалуйста. Нужно построить график по нескольким точкам. В WFA есть такая шняга...

15
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
12.03.2017, 22:17 2
Какую версию OxyPlot ты используешь? У PlotModel нет свойства Points. Есть Series
0
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
12.03.2017, 22:40  [ТС] 3
Цитата Сообщение от ViterAlex Посмотреть сообщение
Какую версию OxyPlot ты используешь? У PlotModel нет свойства Points. Есть Series
Вот полный код :

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
    <Window.DataContext>
        <local:Program/>
    </Window.DataContext>
<oxy:PlotView Model="{Binding MyModel}" Height="500" Width="640" Background="Transparent" Grid.Column="0" Margin="10,10,151,76" />
 
 
public class Program
    {
        public PlotModel MyModel{ get; set; }
        public ScatterSeries MyPoints { get; set; }
        public Random RandomGenerator { get; set; }
 
        public Program()
        {
            RandomGenerator = new Random();
            MyModel = new PlotModel();
            MyPoints = new ScatterSeries();
 
            for (int i = 0; i < 20; i++)
            {
                MyPoints .Points.Add(new ScatterPoint(i, RandomGenerator.NextDouble()));
            }
            MyModel.Series.Add(MyPoints);
        }
 
        public void UpdatePoints()
        {
            MyPoints.Points.Clear();
            MyModel.Series.Clear();
 
            for (int i = 0; i < 20; i++)
            {
                MyPoints.Points.Add(new ScatterPoint(i, RandomGenerator.NextDouble()));
            }
            MyModel.Series.Add(MyPoints);
            MyModel.InvalidatePlot(true);
        }
    }
Метод UpdatePoints() вызывается нажатием кнопочки с основного окна. Что касается версии то она последняя. Сегодня установил.

Пробовал так же использовать Диспатчер. Не помогло.

C#
1
2
3
4
Dispatcher.CurrentDispatcher.InvokeAsync(() =>
            {
                MyModel.InvalidatePlot(true);
            });
0
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
12.03.2017, 22:59 4
Собственно, а что должно очищаться? У тебя график заполняется новыми значениями.
0
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
13.03.2017, 10:45  [ТС] 5
Цитата Сообщение от ViterAlex Посмотреть сообщение
Собственно, а что должно очищаться? У тебя график заполняется новыми значениями.
Ну мне бы хотя бы получить очищение графика. Для начала. Скажем без вот этого момента :

C#
1
2
3
4
5
for (int i = 0; i < 20; i++)
            {
                MyPoints.Points.Add(new ScatterPoint(i, RandomGenerator.NextDouble()));
            }
            MyModel.Series.Add(MyPoints);
Что то там с эвентами OnPropertyChanged я так понимаю. Я это не реализовывал ?
0
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
13.03.2017, 11:27 6
Обновлением графика занимается метод InvalidatePlot, который ты вызываешь у модели. Чтобы очистить график достаточно удалить точки из него и обновить модель. Диспетчер тут ни при чём
C#
1
2
MyPoints.Points.Clear();
MyModel.InvalidatePlot(true);
0
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
13.03.2017, 11:41  [ТС] 7
В этом и проблема, что
C#
1
MyModel.InvalidatePlot(true);
ничего не делает. Что то требуется дополнительно. Диспатчер советовали в гугле использовать но как с ним так и без него график не обновляется.
0
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
13.03.2017, 12:09 8
WepstaR, не знаю. Должно работать. Скинь весь проект. Вечером я сам примерчик набросаю
0
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
13.03.2017, 19:18 9
Лучший ответ Сообщение было отмечено WepstaR как решение

Решение

Смотри пример.
Вложения
Тип файла: zip OxyPlotSample.zip (6.63 Мб, 40 просмотров)
1
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
13.03.2017, 22:43  [ТС] 10
Собственно в этом и проблема. Когда ставишь плагин думаешь там всё автоматический будет. Ищешь как обновить график. Тебе в гугле говорят да что ты. Всё очень просто. Запусти MyModel.InvalidatePlot(true); и всё будет работать.

А то что тебе ещё нужно написать 3 разных класса на обработку PropertyChangedEventHandler только чтобы график обновлялся не упоминают.

Благодарю за помощь. Буду пытаться понять как это использовать. =)
0
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
13.03.2017, 23:19 11
Цитата Сообщение от WepstaR Посмотреть сообщение
А то что тебе ещё нужно написать 3 разных класса
Ты о чём?
0
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
13.03.2017, 23:41  [ТС] 12
Вот тестовый проект который мне сказали должен работать.

Проект не использует классы ViewModelBase.cs CommandReference.cs DelegateCommand.cs как предложен в твоём варианте.
Вложения
Тип файла: rar TestProject.rar (5.31 Мб, 25 просмотров)
0
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
14.03.2017, 10:05 13
Цитата Сообщение от WepstaR Посмотреть сообщение
Проект не использует классы ViewModelBase.cs CommandReference.cs DelegateCommand.cs как предложен в твоём варианте.
Дело не в них, это вспомогательные классы: первый для реализации INotifyPropertyChanged, остальные два — для биндинга команд.
У тебя проблема в том, что в окне создаётся один экземпляр MainProgram, а работаешь ты с другим, созданным в конструкторе формы. Назначь вот этот созданный в конструкторе экземпляр в DataContext формы и всё заработает.
0
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
14.03.2017, 17:46  [ТС] 14
Цитата Сообщение от ViterAlex Посмотреть сообщение
Дело не в них, это вспомогательные классы: первый для реализации INotifyPropertyChanged, остальные два — для биндинга команд.
У тебя проблема в том, что в окне создаётся один экземпляр MainProgram, а работаешь ты с другим, созданным в конструкторе формы. Назначь вот этот созданный в конструкторе экземпляр в DataContext формы и всё заработает.
Не совсем понял.

C#
1
2
3
<Window.DataContext>
        <local:Program/>
    </Window.DataContext>
Этот ДатаКонтекст ? Но как тогда я смогу обращаться к методам этого экземпляра из Window класса ?
0
8443 / 4630 / 1813
Регистрация: 11.02.2013
Сообщений: 9,852
14.03.2017, 22:03 15
Лучший ответ Сообщение было отмечено WepstaR как решение

Решение

WepstaR, поставь точку останова после InitializeComponent в конструкторе окна
C#
1
2
3
4
5
public MainWindow()
{
    InitializeComponent();
    MainProgram = new Program();
}
и посмотри, что записано в DataContext формы. Ты увидишь, что там уже лежит объект Program. Ты же создаёшь новый экземпляр, который с DataContext не связан. Самых простых решения два:
  1. назначить новый созданный экземпляр Program в DataContext окна:
    C#
    1
    
    DataContext = MainProgram;
  2. Не создавать новый экземпляр Program, а использовать уже созданный в DataContext:
    C#
    1
    
    MainProgram = (Program) DataContext;
Я бы предпочёл второй.
1
23 / 3 / 3
Регистрация: 16.02.2014
Сообщений: 170
Записей в блоге: 1
14.03.2017, 22:17  [ТС] 16
ОМГ благодарю. Всё работает =)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2017, 22:17

Построить график в WPF
Здравствуйте. Есть программа которая сортирует массив по указанному методу и фиксирует время...

Использование WIA в WPF
Using WIA пишу вот так, в результате подчеркивает. Пространство имен не известно. в reference...

Как создать график в wpf?
Необходимо построить график, который будет считывать информацию из файла. Как это реализовать?...

[WPF] Построить график функции
Допустим, мне необходимо построить график следующей функции: Точки получаю так: ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru