OxyPlot中的LineAnnotation在WPF和XAML中的可见性

3
我已经在XAML中配置了一个Oxyplot,使用的是Plot而不是PlotView。(我使用单独的属性绑定,而不是完整的PlotModel绑定。)
这个配置使用了6个LineAnnotations,我希望可以选择性地显示或隐藏它们。
我使用了绑定来连接LineAnnotations的Visibility属性和ViewModel中的属性。这些属性是布尔型的,我使用了转换器将值转换为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"),但没有效果。

即使绑定不起作用,在XAML中硬编码该值应该也能起作用。


展示一些代码,这样我们就可以看到是否有问题。 - Fabian S.
尝试将线系列的颜色设置为透明。我知道这不是最好的解决方案,但我曾经遇到过同样的问题,这对我有用。 - Jose
如果您查看视觉树,您会发现再也没有LineAnnotation实体了,您甚至可能无法检查Visibility属性的值。所有这些都已经消失了,分解成了基本组件,如PolylinePathTextBlock等。 - jsanalytics
1
@jstreet,谢谢,我会看一下的。我的代码实际上是在一个旧的C++应用程序中运行,我不认为有一种简单的方法来查看可视树。我将不得不制作一个小的测试应用程序。 - Phil Jollans
1
@jstreet 这显示了一个空窗口。我的WPF窗口位于WinForms主机控件中,该控件是ComVisible的,并作为ActiveX控件加载到MFC应用程序中(字面上来说是上个世纪的)。真奇妙它居然能工作。我将创建一个纯WPF的测试应用程序来查看可视树。 - Phil Jollans
显示剩余2条评论
1个回答

4
在目前的OxyPlot和OxyPlot.Wpf实现中,这将无法正常工作。
OxyPlot.Wpf.LineAnnotation类是内部类OxyPlot.LineAnnotation的包装器。要处理Visiblilty属性,它必须将该属性映射到内部LineAnnotation类的适当属性。
有两个问题。不仅Wpf.LineAnnotation没有处理Visiblilty属性,而且在LineAnnotation类中也没有底层属性可以映射到它。LineAnnotation类似乎没有任何隐藏自身的概念。
这是OxyPlot和XAML之间的不匹配。正如jstreet指出的那样,LineAnnotation根本没有出现在Visual Tree中。

1
一个相当简单的解决方法是将StrokeThickness设置为0以隐藏LineAnnotation。这可以通过绑定来设置。 - Phil Jollans
除了设置StrokeThickness之外,另一个可能性是将颜色设置为透明或另一种alpha值为零的颜色。因为Opacity似乎也不起作用... - heltonbiker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接