c# - WPF 和 XAML 中的 OxyPlot LineAnnotation 可见性

标签 c# wpf xaml mvvm oxyplot

我使用 Plot 而不是 PlotView 在 XAML 中配置了一个 Oxyplot。 (我在单个属性上使用 Binding,而不是在完整的 PlotModel 上使用。)

配置使用了 6 个 LineAnnotations,我想选择显示或隐藏。

我使用 Binding 将 LineAnnotations 的 Visibility 属性连接到我的 ViewModel 中的属性。属性是 bool 值,我使用转换器将值转换为 Visibility.Collapsed 或 Visibility.Visible(但我也可以定义类型为 Visibility 的属性)。

这行不通。 LineAnnotations 始终可见。

事实上,我认为 LineAnnotation 的 Visibility 属性根本不起作用。

有人可以确认这个问题吗?

是否有其他方法可以根据我的 ViewModel 中的属性显示或隐藏 LineAnnotations?

我更愿意坚持使用 XAML 配置,而不是在代码中添加和删除 LineAnnotations。

更新

根据要求,一些代码

XAML

<oxy:Plot Grid.Row="1">
  <oxy:Plot.Axes>
    <oxy:LinearAxis Key="yAxis"
                    Position="{Binding Path=XAxisInverted, Converter={StaticResource BoolToAxisPosition_fl_tr}}"
                    Minimum="{Binding YAxis_Min}"
                    Maximum="{Binding YAxis_Max}"
                    MajorGridlineStyle="Dot"
                    MajorGridlineColor="LightGray"
                    Title="Velocity [km/h]" />
    <oxy:LinearAxis Key="xAxis"
                    Position="Bottom"
                    Minimum="{Binding XAxisNumericMin}"
                    Maximum="{Binding XAxisNumericMax}"
                    StartPosition="{Binding Path=XAxisInverted, Converter={StaticResource BoolToInt_f0_t1}}"
                    EndPosition="{Binding Path=XAxisInverted, Converter={StaticResource BoolToInt_f1_t0}}"
                    MajorGridlineStyle="Dot"
                    MajorGridlineColor="LightGray"
                    Title="Position [m]" />
  </oxy:Plot.Axes>
  <oxy:Plot.Series>
    <oxy:LineSeries ItemsSource="{Binding PointsRef1}"
                    DataFieldX="X"
                    DataFieldY="Y"
                    StrokeThickness="1"
                    MarkerSize="0"
                    LineStyle="Solid"
                    Color="DarkGray"
                    MarkerType="None"/>
    <oxy:LineSeries ItemsSource="{Binding PointsRef2}"
                    DataFieldX="X"
                    DataFieldY="Y"
                    StrokeThickness="1"
                    MarkerSize="0"
                    LineStyle="Solid"
                    Color="DarkGray"
                    MarkerType="None"/>
    <oxy:LineSeries ItemsSource="{Binding PointsBlack}"
                    DataFieldX="X"
                    DataFieldY="Y"
                    StrokeThickness="1"
                    MarkerSize="0"
                    LineStyle="Solid"
                    Color="Black"
                    MarkerType="None"/>
    <oxy:LineSeries ItemsSource="{Binding PointsRed}"
                    DataFieldX="X"
                    DataFieldY="Y"
                    StrokeThickness="1"
                    MarkerSize="0"
                    LineStyle="Solid"
                    Color="Red"
                    MarkerType="None"/>
    <oxy:LineSeries ItemsSource="{Binding PointsBlue}"
                    DataFieldX="X"
                    DataFieldY="Y"
                    StrokeThickness="1"
                    MarkerSize="0"
                    LineStyle="Solid"
                    Color="Blue"
                    MarkerType="None"/>
    <oxy:LineSeries ItemsSource="{Binding PointsGreen}"
                    DataFieldX="X"
                    DataFieldY="Y"
                    StrokeThickness="1"
                    MarkerSize="0"
                    LineStyle="Solid"
                    Color="Green"
                    MarkerType="None"/>
  </oxy:Plot.Series>
  <oxy:Plot.Annotations>
    <oxy:LineAnnotation x:Name="BrakePosRear"   Type="Vertical" Color="{Binding BrakePosRear_1_Color}"  Visibility="{Binding Path=BrakePosRear_1_Enabled,  Converter={StaticResource BoolToVisibility}}" X="{Binding BrakePosRear_1_Value}"  local:AnnotationDragableBehavior.IsDragable="True" />
    <oxy:LineAnnotation x:Name="BrakePosFront"  Type="Vertical" Color="{Binding BrakePosFront_1_Color}" Visibility="{Binding Path=BrakePosFront_1_Enabled, Converter={StaticResource BoolToVisibility}}" X="{Binding BrakePosFront_1_Value}" local:AnnotationDragableBehavior.IsDragable="True" />
    <oxy:LineAnnotation x:Name="RefPos"         Type="Vertical" Color="{Binding RefPos_1_Color}"        Visibility="{Binding Path=RefPos_1_Enabled,        Converter={StaticResource BoolToVisibility}}" X="{Binding RefPos_1_Value}"        local:AnnotationDragableBehavior.IsDragable="True" />
    <oxy:LineAnnotation x:Name="BrakePosRear2"  Type="Vertical" Color="{Binding BrakePosRear_2_Color}"  Visibility="{Binding Path=BrakePosRear_2_Enabled,  Converter={StaticResource BoolToVisibility}}" X="{Binding BrakePosRear_2_Value}"  local:AnnotationDragableBehavior.IsDragable="True" />
    <oxy:LineAnnotation x:Name="BrakePosFront2" Type="Vertical" Color="{Binding BrakePosFront_2_Color}" Visibility="{Binding Path=BrakePosFront_2_Enabled, Converter={StaticResource BoolToVisibility}}" X="{Binding BrakePosFront_2_Value}" local:AnnotationDragableBehavior.IsDragable="True" />
    <oxy:LineAnnotation x:Name="RefPos2"        Type="Vertical" Color="{Binding RefPos_2_Color}"        Visibility="{Binding Path=RefPos_2_Enabled,        Converter={StaticResource BoolToVisibility}}" X="{Binding RefPos_2_Value}"        local:AnnotationDragableBehavior.IsDragable="True" />
  </oxy:Plot.Annotations>
</oxy:Plot>

类型转换器

class BoolToVisibility : IValueConverter
{
  public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
  {
    return System.Convert.ToBoolean ( value ) ? Visibility.Visible : Visibility.Collapsed ;
  }

  public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
  {
    throw new NotImplementedException ();
  }
}

我还有一个附加行为来处理 LineAnnotation 上的鼠标事件(这很酷),但我认为它不相关。

我也曾尝试在 XAML 中直接指定 Visibility="Collapsed"(以及“Hidden”),但没有任何效果。

即使绑定(bind)不起作用,在 XAML 中对值进行硬编码也应该起作用。

最佳答案

在当前的 OxyPlot 和 OxyPlot.Wpf 实现中,这将不起作用。

OxyPlot.Wpf.LineAnnotation 类是内部类 OxyPlot.LineAnnotation 的包装器。要处理 Visiblilty 属性,它必须将该属性映射到内部 LineAnnotation 类的适当属性。

有两个问题。不仅 Wpf.LineAnnotation 不处理 Visiblilty 属性,而且 LineAnnotation 类中也没有可将其映射到的基础属性。 LineAnnotation 类似乎没有任何隐藏自身的概念。

这是 OxyPlot 和 XAML 之间的不匹配。正如 jstreet 指出的那样,LineAnnotation 根本没有出现在可视化树中。

关于c# - WPF 和 XAML 中的 OxyPlot LineAnnotation 可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41297970/

相关文章:

xaml - 如何获取项目控件中项目的索引

WPF 选项卡样式

c# - 显示图像的时间很短

c# - 如何创建调用两个表的操作方法

c# - 如何让双击编辑在我的 ListView 中的一行上工作?

c# - 闪烁的窗口不适用于 TabbedThumbnail(自定义任务栏预览)

wpf - TransformToDevice 在 Windows 8.1 上不返回正确的 DPI 系数

c# - 追加和写入目录的访问权限——FileIOPermission 会产生不好的结果吗?

wpf - 如何更新 wpf 数据网格上的过滤器?

wpf - XAML vs WPF vs Store App vs Phone App vs UWA