我正在试验机器人手臂和模糊逻辑。我的目标是绘制用户创建的隶属函数(简单三角形和梯形函数)。 oxy Plot'对象'位于扩展器上,该扩展器位于MainWindow上。绘图选择很可能来自下拉列表或文本框。
很遗憾,我无法弄清楚如何使用新信息更新地块。根据时间,所有示例似乎都是动态的。但我需要它基于用户需求!我能找到的最接近的示例是Refresh和Task演示文件,我认为。
到目前为止,我已经能够使用以下语法生成带有标题和轴的原始空白图:
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上出售。如果有更好的方法,我愿意尝试一下。谢谢你的阅读。
答案 0 :(得分:4)
在OxyPlot中使用PlotModel
背后的想法是使用MVVM,所以你不应该真正使用Codebehind来做你想做的事情。您应首先检查对于WPF非常重要的concept of MVVM,然后查看不同的MVVM框架来帮助您,例如Caliburn Micro或MVVM Light
您的代码存在的问题是,当您执行this.plotModel = CreatePlot("Mag2")
时,您正在创建一个新的PlotModel对象,然后WPF会丢失他对旧对象的绑定。您应该通知他(实现INotifyPropertyChange
)PlotModel属性已更改。
但无论如何,要更改标题,你不应该重新创建一个完整的PlotModel,你应该只做this.PlotModel.Title = "Mag2"
之类的事情。
此外,PlotModel本身有一个刷新方法,最好调用这个方法而不是调用Plot的刷新。
祝你好运。