在XAML中设置WPF OxyPlot PlotView的样式 [英] Styling WPF OxyPlot PlotViews in XAML
问题描述
设置OxyPlot绘图视图时,可以通过各种控件显式定义绘图,也可以通过绑定到 PlotModel
进行设置.
When setting up an OxyPlot plot view, you can either define the plot explicitly through various controls, or set it up through a binding to a PlotModel
.
因此,在第一种情况下,用于两个 LineSeries
对象的图的XAML可能类似于
As such, in the first case, the XAML for a plot of two LineSeries
objects could look something like
<oxy:Plot Title="Some plot">
<oxy:Plot.Axes>
<oxy:LinearAxis Position="Left" />
<oxy:LinearAxis Position="Bottom" />
</oxy:Plot.Axes>
<oxy:Plot.Series>
<oxy:LineSeries ItemsSource="{Binding ActualSeriesData1}" DataFieldX="X" DataFieldY="Y"/>
<oxy:LineSeries ItemsSource="{Binding ActualSeriesData2}" DataFieldX="X" DataFieldY="Y"/>
</oxy:Plot.Series>
</oxy:Plot>
具有非常薄的视图模型.另一方面,在第二种情况下,我只会有类似
with a very thin view-model. On the other hand, in the second case, I would simply have something like
<oxy:PlotView Model="{Binding SomePlotModel}" />
并在视图模型中构建实际图.两种设置都有优点和缺点,但是我发现当我事先知道我实际想要绘制的内容时,第一种方法通常会更好,而第二种方法则允许动态更改打印内容.
and construct the actual plot in the view-model. There are pros and cons to both setups, but I find that the first approach generally works better when I know beforehand what I actually want to plot, whereas the second approach allows for dynamic changes to the plot contents.
我的问题如下:对于第一种情况,我知道如何向所有绘图添加常规样式.例如,如果我希望他们使它们看起来像Seaborn,那么我只需添加
My issue is the following: For the first case I know how to add general styling to all plots. If, for instance, I want them to make them look Seaborn-like, I would just add something like
<x:Array Type="Color" x:Key="SeabornColors">
<Color>#4c72b0</Color>
<Color>#55a868</Color>
<Color>#c44e52</Color>
<Color>#8172b2</Color>
<Color>#ccb974</Color>
<Color>#64b5cd</Color>
</x:Array>
<Style TargetType="oxy:Plot">
<Setter Property="PlotAreaBackground" Value="#EBEBF2" />
<Setter Property="PlotAreaBorderThickness" Value="0" />
<Setter Property="TitleFont" Value="Segoe UI" />
<Setter Property="TitleFontWeight" Value="Normal" />
<Setter Property="DefaultColors" Value="{StaticResource SeabornColors}"/>
</Style>
<Style TargetType="oxy:LinearAxis">
<Setter Property="TicklineColor" Value="White" />
<Setter Property="MajorGridlineColor" Value="White" />
<Setter Property="MinorGridlineColor" Value="White" />
<Setter Property="ExtraGridlineColor" Value="White" />
<Setter Property="AxislineColor" Value="White" />
<Setter Property="TitleColor" Value="Black" />
<Setter Property="TextColor" Value="Black" />
<Setter Property="Font" Value="Segoe UI" />
<Setter Property="TitleFont" Value="Segoe UI" />
<Setter Property="TickStyle" Value="None" />
<Setter Property="MajorGridlineStyle" Value="Solid" />
</Style>
到我的 ResourceDictionary
.在第二种情况下,如何使用 oxy:PlotView
获得相同的效果?我可以使用< Style TargetType ="oxy:PlotView"/>
设置一些常规样式属性,但是我将如何对包含的所有 LineSeries
进行样式设置在 PlotView
中的 Model
中的 Series
中?
to my ResourceDictionary
. How can I achieve the same effect in the second case, i.e. using an oxy:PlotView
? I can set some of the general styling properties using a <Style TargetType="oxy:PlotView" />
, but how would I style, say, all LineSeries
contained within a Series
within a Model
within a PlotView
?
推荐答案
我没有听完所有注释,但是其中一些似乎已经包含指向解决方案的链接.我有一个示例,其中我使用了MVVM方法并更改了这些设置.它应该会帮助:
I didn't get through all the comments but some of them seems to already contain links to the solution. I have an example where I'm using MVVM approach and changing those setting. It should help:
在MainWindow.xaml中:
In MainWindow.xaml:
<oxy:PlotView Name="TestView" Model="{Binding plotModel}" Grid.Row="0" Grid.Column="1" />
在我的MainWindowViewModel.cs中:
In my MainWindowViewModel.cs:
private PlotModel m_plotModel;
public PlotModel plotModel
{
get { return m_plotModel; }
set => SetAndRaisePropertyChanged(ref m_plotModel, value);
}
public UserControlOscilloViewModel()
{
var signalAxis = new CategoryAxis()
{
Position = AxisPosition.Left,
Minimum = 0,
MinimumMinorStep = 1,
AbsoluteMinimum = 0,
TicklineColor = OxyColors.Transparent,
};
var timeAxis = new LinearAxis()
{
Position = AxisPosition.Bottom,
Minimum = 0,
MinimumMajorStep = 1,
AbsoluteMinimum = 0,
};
plotModel = new PlotModel();
plotModel.Axes.Add(signalAxis);
plotModel.Axes.Add(timeAxis);
}
然后,当您刷新模型时,可以根据需要像这样访问轴:
Then when you are refreshing your model, you can access your axis like this if needed:
CategoryAxis signalAxis = (CategoryAxis)plotModel.Axes.ElementAt(0);
LinearAxis timeAxis = (LinearAxis)plotModel.Axes.ElementAt(1);
并添加这样的系列:
var series = new LineSeries
{
Color = OxyColors.SeaShell,
LineStyle = LineStyle.Dash
};
foreach (DataPoint p in ListOfPoints)
{
series.Points.Add(p);
}
plotModel.Series.Add(series);
plotModel.InvalidatePlot(true);
我没有完全解决您的要求,但是我认为您可以通过此操作访问所有需要的对象/成员.我还简化了代码以提高清晰度,希望这样做时不要破坏任何东西.
I'm not addressing exactly what you asked, but I think you have access to all needed objects/members by doing this. I also simplified my code to improve clarity, I hope I didn't break anything when doing so...
这篇关于在XAML中设置WPF OxyPlot PlotView的样式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!