Положение всплывающей подсказки в Оксиплоте - PullRequest
0 голосов
/ 08 июня 2019

Я недавно использую OxyPlot для рисования диаграмм для моего проекта WPF. У меня есть проблема с всплывающей подсказкой в ​​серии строк. Прямоугольный прямоугольник всплывающей подсказки находится слишком близко к точке, где находится моя мышь. Мне интересно, есть ли способ изменить положение окна всплывающей подсказки и сделать его дальше от курсора. Большое спасибо. Например, я хотел бы переместить окно всплывающей подсказки (в красном поле) немного вправо. enter image description here

[Изменить]

Следуя идее Ану, я добавил следующий код, но, похоже, он работает не так, как ожидалось.

В файле xaml.cs я добавил

<UserControl.Resources>
    <popups:ScreenPointToOffSetScreenPointConverter x:Key="ScreenPointToOffSetScreenPointConverter"/>
</UserControl.Resources>

А затем измените мой OxyPlot на

<ItemsControl ItemsSource="{Binding AmplitudeDtos}" Margin="0" Name="Amplitude" >
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid popups:GridUtilities.ItemsPerRow="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type dtoModels:SignalDto}">
            <oxy:PlotView Height="Auto" Width="Auto" MinHeight="40" MinWidth="100" HorizontalContentAlignment="Stretch" 
                          FontStyle="Normal" FontFamily="Roboto, Microsoft YaHei" FontSize="8" Model="{Binding PlotModel}" Controller="{Binding PlotController}" Padding="8" Margin="0">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Loaded">
                        <i:InvokeCommandAction Command="{Binding SignalLoadedCommand}" CommandParameter="{Binding}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                <oxy:PlotView.DefaultTrackerTemplate>
                    <ControlTemplate>
                        <oxy:TrackerControl Position="{Binding Position, Converter={StaticResource ScreenPointToOffSetScreenPointConverter}}" LineExtents="{Binding PlotModel.PlotArea}">
                            <oxy:TrackerControl.Content>
                                <TextBlock Text="{Binding}" />
                            </oxy:TrackerControl.Content>
                        </oxy:TrackerControl>
                    </ControlTemplate>
                </oxy:PlotView.DefaultTrackerTemplate>
            </oxy:PlotView>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>    

Обратите внимание, что мой OxyPlot находится в шаблоне данных.

Класс ScreenPointToOffSetScreenPointConverter точно такой же, как в примере с Ану.

1 Ответ

0 голосов
/ 08 июня 2019

Относительно простым решением для этого требования было бы изменить DefaultTrackerTemplate и использовать пользовательский конвертер для изменения позиции. Например, вы можете определить конвертер ScreenPoint следующим образом

public class ScreenPointToOffSetScreenPointConverter : IValueConverter
{
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(value is ScreenPoint screenPoint)
            {
                return new ScreenPoint(screenPoint.X + 50, screenPoint.Y);
            }
            return value;
        }

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

А потом в вашем XAML

<oxy:PlotView  Model="{Binding MyModel}">
            <oxy:PlotView.DefaultTrackerTemplate>
                <ControlTemplate>
                    <oxy:TrackerControl Position="{Binding Position,Converter={StaticResource ScreenPointToOffSetScreenPointConverter}}" LineExtents="{Binding PlotModel.PlotArea}">
                        <TextBlock Text="{Binding}" />
                    </oxy:TrackerControl>
                </ControlTemplate>
            </oxy:PlotView.DefaultTrackerTemplate>
        </oxy:PlotView>

Конвертер добавил бы смещение в позицию ScreenPoint для трекера. Вы можете изменить значение смещения для преобразователя, если это соответствует требованиям вашего приложения.

...