【发布时间】:2017-08-20 02:44:15
【问题描述】:
在设置 OxyPlot 绘图视图时,您可以通过各种控件显式定义绘图,或通过绑定到 PlotModel 来设置它。
因此,在第一种情况下,两个 LineSeries 对象的图的 XAML 可能类似于
<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>
具有非常薄的视图模型。另一方面,在第二种情况下,我只会有类似
<oxy:PlotView Model="{Binding SomePlotModel}" />
并在视图模型中构建实际绘图。两种设置各有利弊,但我发现当我事先知道我真正想要绘制的内容时,第一种方法通常效果更好,而第二种方法允许对绘图内容进行动态更改。
我的问题如下:对于第一种情况,我知道如何为所有绘图添加一般样式。例如,如果我想让它们看起来像 Seaborn,我会添加类似
<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 的样式,比如Series 中的Model 中的Model 中的PlotView?
【问题讨论】:
-
我也遇到过同样的问题,我能够解决的唯一方法是使用后面的代码来设置 PlotModels 上的属性。它仍然将设计与逻辑分开,但遗憾的是没有使用 XAML 或样式。
-
@Herman:有没有一种直接的方法可以适用于应用程序中的所有 PlotModel?这是将其设置为样式的好处之一。
-
我能想到的最好方法是为每种样式创建一个以 PlotModel 作为参数的方法,然后遍历所有绘图模型并为每个 PlotModel 调用该方法。从理论上讲,您可以在一个窗口中找到所有 PlotViews 并提取 PlotModel,但在我的情况下,我的 ViewModel 已经有一个绘图模型数组,因此更简单。
-
我认为你的问题不够具体。每当使用
PlotView/PlotModel/Plot时,没有什么能阻止您重新使用 XAML 资源,无论是作为StaticResource还是通过代码隐藏中的Application.Current.Resources["SomeResourceKey"]。但请记住,可能存在不兼容的类型,例如,Color和OxyColor之间。而且在OxyPlot.Wpf.LinearAxis和OxyPlot.Axes.LinearAxis之间...... -
@RobL 取决于项目的类型;因为这个特别是关于 WPF,我们会做
xmlns:oxy="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf"。我不知道在Xamarin.Forms中调用了哪些相关类型,但如果它没有Plot,我猜你会使用你在Xamarin.Forms中使用的任何东西。