首页 文章

根据需要更新Oxyplot C#WPF

提问于
浏览
0

我正在试验机器人手臂和模糊逻辑 . 我的目标是绘制用户创建的隶属函数(简单三角形和梯形函数) . oxy Plot 'object'位于一个扩展器上,位于MainWindow上 . 绘图选择很可能来自下拉列表或文本框 .

Unfortunately, I cannot figure out how to update a plot with new information. All of the examples appear to be dynamic, based on time. But I need it to be based on user demand! 我认为最接近的例子是RefreshTask演示文件 .

到目前为止,我已经能够使用以下语法生成带有 Headers 和轴的原始空白图:

public partial class MainWindow : Window
 {

    private PlotModel plotModel;

    public PlotModel PlotModel
    {
        get
        {
            return this.plotModel;
        }
        set
        {
            this.plotModel = value;
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        this.PlotModel = CreatePlot("mag1");
    }


    private PlotModel CreatePlot(string title)
    {
        var pm = new PlotModel(title);

        return pm;
    }

和XAML

<Window x:Class="FuzzyGripper.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:oxy="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf"
    Title="MainWindow" Height="800" Width="1000" Closing="Window_Closing" Loaded="Window_Loaded">

...... A ton of stuff ...... then......

<oxy:Plot x:Name="plot1" Model="{Binding PlotModel}"/>

当我想用一个像新 Headers 这样简单的东西更新情节时,问题就来了 . 据我所知,OxyPlot只能在对象位于MainWindow构造函数中时更新 . 例如,在创建原始图之后调用以下代码段(在MainWindow(){}之外):

this.plotModel = CreatePlot("Mag2");
plot1.RefreshPlot(true);

它不起作用 . 原始情节仍然存在, Headers 为“Mag1” . 我有一种感觉,我错过了与上下文相关的东西,特别是 - DataContext - 但我对这种语言并不是很满意,所以我被困了!话虽如此,我并没有完全在Oxyplot上出售 . 如果有更好的方法,我愿意尝试一下 . 谢谢阅读 .

1 回答

  • 4

    在OxyPlot中使用 PlotModel 背后的想法是使用MVVM,所以你不应该尝试这样做 . 您应首先检查concept of MVVM这对WPF非常重要,然后查看不同的MVVM框架来帮助您,例如Caliburn MicroMVVM Light

    你的代码的问题是当你正在做 this.plotModel = CreatePlot("Mag2") 时,你正在创建一个新的PlotModel对象,然后WPF失去了他对旧对象的绑定 . 您应该通知他(实现 INotifyPropertyChange )PlotModel属性已更改 .

    但无论如何,要改变 Headers 你不应该重新创建一个完整的PlotModel,你应该简单地做一些像 this.PlotModel.Title = "Mag2" .

    此外,PlotModel本身有一个刷新方法,最好调用这个方法而不是调用Plot的刷新 .

    祝好运 .

相关问题