如何在 XAML 图中定义自定义控制器

How to define custom Controller in XAML Plot

我有 2 个关于 oxyplot 的问题,因为它们很简单,所以我把它们放在一起:

  1. 如何在 XAML 中定义自定义绘图控制器?我注意到 Controller 属性 在 PlotView class 中,但我在 剧情class。我错过了什么,还是目前不可能?
  2. 最大范围 属性 是否适用于 DateTimeAxis?单位是什么?我试过几百或几千左右的值,但似乎缩放不受限制。

我的剧情在XAML中定义如下:

<oxy:Plot>
    <oxy:Plot.Axes>
        <oxy:DateTimeAxis Title="Time" Position="Bottom" StringFormat="HH:mm:ss" />
        <oxy:LinearAxis Title="Temperature" Position="Left" Key="Temperature" />
        <oxy:LogarithmicAxis Title="Pressure" Position="Right" Key="Pressure" />
    </oxy:Plot.Axes>
    <oxy:Plot.Series>
        <oxy:LineSeries Title="Temperature" ItemsSource="{Binding Temperatures, Mode=OneWay}" DataFieldY="Temperature" YAxisKey="Temperature" />
        <oxy:LineSeries Title="Pressure" ItemsSource="{Binding Pressures, Mode=OneWay}" DataFieldY="Pressure" YAxisKey="Pressure" />
    </oxy:Plot.Series>
</oxy:Plot>

通过 XAML 添加自定义控制器似乎是不可能的,所以我使用 System.Windows.Interactivity.Behavior 编辑地块的控制器而没有隐藏代码。

行为定义如下:

public class CustomControllerPlotBehavior : System.Windows.Interactivity.Behavior<Plot>
{
    protected override void OnAttached()
    {
        AssociatedObject.Loaded += OnLoaded;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Loaded -= OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        CustomizeController(AssociatedObject.ActualController);
    }

    private void CustomizeController(IPlotController controller)
    {
        controller.UnbindAll();

        // actual changes to the controller
        controller.BindMouseDown(OxyMouseButton.Left, OxyModifierKeys.Shift, PlotCommands.ZoomRectangle);
        controller.BindMouseDown(OxyMouseButton.Left, OxyModifierKeys.Control, PlotCommands.PanAt);
        controller.BindMouseDown(OxyMouseButton.Left, PlotCommands.SnapTrack);
        controller.BindKeyDown(OxyKey.Home, PlotCommands.Reset);
        controller.BindMouseWheel(PlotCommands.ZoomWheel);
        controller.BindMouseWheel(OxyModifierKeys.Control, PlotCommands.ZoomWheelFine);
    }
}

在XAML中,行为可以这样使用:

<oxy:Plot>
    <!-- Other plot settings -->
    <i:Interaction.Behaviors>
        <behaviors:CustomControllerPlotBehavior />
    </i:Interaction.Behaviors>
</oxy:Plot>