0

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

不幸的是,我无法弄清楚如何使用新信息更新绘图。所有的例子似乎都是动态的,基于时间。但我需要它基于用户需求!我认为最接近的例子是RefreshTask演示文件。

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

 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}"/>

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

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

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

4

1 回答 1

4

使用 OxyPlot 背后的想法PlotModel是使用 MVVM,因此您不应该真正使用 Codebehind 来做您想做的事情。您应该首先检查对 WPF 非常重要的 MVVM 概念,然后查看不同的 MVVM 框架来帮助您,例如Caliburn MicroMVVM Light

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

但无论如何,要更改标题,您不应该重新创建整个 PlotModel,您应该简单地执行类似this.PlotModel.Title = "Mag2".

另外,PlotModel 本身有一个 refresh 方法,最好调用这个而不是调用 Plot 的 refresh。

祝你好运。

于 2013-12-13T14:04:48.427 回答