Подсказка или что-то подобное перемещается с курсором в WPF - PullRequest
8 голосов
/ 28 сентября 2011

Можно ли переместить Tooltip или что-то подобное с курсором, когда мышь переходит на определенный элемент управления?

Я пробовал TextBlock, но свойство Margin не работает.

    private TextBlock tooltip = new TextBlock();
    private void imgRoom_MouseEnter(object sender, MouseEventArgs e)
    {           
        Point position = e.GetPosition((IInputElement)sender);
        tooltip.Visibility = System.Windows.Visibility.Visible; 
        tooltip.Margin = new Thickness(position.X, position.Y, 0, 0);           
        tooltip.Width = 100;
        tooltip.Height = 100;
        tooltip.Background = new SolidColorBrush(Colors.Red);
    }

    private void imgRoom_MouseMove(object sender, MouseEventArgs e)
    {
        Point position = e.GetPosition((IInputElement)sender);
        tooltip.Margin = new Thickness(position.X, position.Y, 0, 0);
    }

Ответы [ 3 ]

14 голосов
/ 28 сентября 2011

Эффект можно получить с помощью всплывающего окна и нескольких простых свойств. Из окна кода ...

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Rectangle Name="rect" Margin="50,50,0,0" Width="100" Height="100" Fill="LightBlue" MouseMove="Rectangle_MouseMove" MouseLeave="Rectangle_MouseLeave" />

    <Popup Name="floatingTip" AllowsTransparency="True" Placement="Relative" PlacementTarget="{Binding ElementName=rect}">
      <TextBlock>Look At Me</TextBlock>
    </Popup>
  </Grid>

</Window>

И вот как будет выглядеть кодовый код.

...
private void Rectangle_MouseMove(object sender, MouseEventArgs e)
{
  if (!floatingTip.IsOpen) { floatingTip.IsOpen = true; }

  Point currentPos = e.GetPosition(rect);

  // The + 20 part is so your mouse pointer doesn't overlap.
  floatingTip.HorizontalOffset = currentPos.X + 20;
  floatingTip.VerticalOffset = currentPos.Y;
}

private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
{
  floatingTip.IsOpen = false;
}
...

Итак, из XAML вы можете видеть, что размещение всплывающего окна относительно прямоугольника. Когда вы наводите курсор мыши на прямоугольник, он становится видимым, и его положение обновляется при перемещении мыши. Естественно, это очень простое решение, но с некоторыми незначительными изменениями, обработкой таких событий, как MouseEnter и корректировкой свойств, вы можете получить действительно полезные эффекты.

2 голосов
/ 12 марта 2012

Я не знаю, является ли это наилучшей практикой или она хорошо работает, но вы можете использовать Adorner.

Я создал подтверждение концепциираньше, но не использовал его в производственном сценарии (пока).Adorner может быть использован для создания чего-то подобного (всплывающей подсказки), либо для пользовательского курсора мыши или значков перетаскивания цели.

Убедитесь, что вы установили IsHitTestVisible = false, если Adorner не нуждается в проверке на удар и можетпоявляются прямо под указателем мыши.

ОБНОВЛЕНИЕ

Просто полностью прочитайте описание украшателей:

Общие приложения для украшателей включают в себя:

  • Добавление в UIElement функциональных дескрипторов, которые позволяют пользователю каким-либо образом манипулировать элементом (изменять его размер, вращать, перемещать и т.различные состояния или в ответ на различные события.
  • Наложение визуальных декораций на элемент UIElement.
  • Визуально маскировать или переопределить часть или весь элемент UIElement.
0 голосов
/ 02 декабря 2013

Перемещает всплывающую подсказку с помощью курсора мыши.

    private void OnMouseMoveHandler(object sender, MouseEventArgs args)
    {
        if ((sender as FrameworkElement).ToolTip == null)
            (sender as FrameworkElement).ToolTip = new ToolTip() { Placement = PlacementMode.Relative };
        double x = args.GetPosition((sender as FrameworkElement)).X;
        double y = args.GetPosition((sender as FrameworkElement)).Y;
        var tip = ((sender as FrameworkElement).ToolTip as ToolTip);
        tip.Content = tooltip_text;
        tip.HorizontalOffset = x + 10;
        tip.VerticalOffset = y + 10;
    }
...