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

問題は、新しいタイトルのような単純なものでプロットを更新したいときに発生します。OxyPlot は、オブジェクトが MainWindow コンストラクターに配置されている場合にのみ更新できます。たとえば、次のスニペットは、元のプロットが作成された後 ( MainWindow(){} の外側) に呼び出されます。

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

うまくいきません。元のプロットは「Mag1」というタイトルで残っています。コンテキスト、具体的には DataContext に関連する何かが欠けているような気がしますが、言語にあまり慣れていないため、行き詰まっています! そうは言っても、私は Oxyplot に完全に満足しているわけではありません。より良いアプローチがあれば、喜んで試してみたいと思います。読んでくれてありがとう。

4

1 に答える 1

4

PlotModelOxyPlot で を使用する背後にある考え方は、MVVM を使用することです。そのため、実行しようとしていることにコードビハインドを実際に使用するべきではありません。最初に WPF にとって非常に重要なMVVM の概念を確認してから、 Caliburn MicroMVVM Lightなどのさまざまな MVVM フレームワークを調べて、それを支援する必要があります。

コードの問題はthis.plotModel = CreatePlot("Mag2")、新しい PlotModel オブジェクトを作成しているときに、WPF が古いオブジェクトとのバインディングを失うことです。INotifyPropertyChangePlotModel プロパティが変更されたことを彼に ( を実装して) 通知する必要があります。

とにかく、タイトルを変更するには、PlotModel 全体を再作成するべきではなく、単純にthis.PlotModel.Title = "Mag2".

また、PlotModel 自体にも refresh メソッドがあります。Plot の refresh を呼び出す代わりに、これを呼び出す方がよいでしょう。

幸運を。

于 2013-12-13T14:04:48.427 に答える