2011-09-28 14 views
7

¿Es posible mover un Tooltip o algo así con el cursor cuando el mouse va a un control específico?Una información sobre herramientas o algo similar se mueve con el cursor en WPF

intenté TextBlock, pero Margin propiedad no funciona.

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); 
    } 
+0

Muestra tu código y probablemente veremos tus intenciones. –

+0

¿quiere decir que quiere que la información sobre herramientas se mueva junto con el cursor del mouse? Si es así, ¿no falla eso con el objetivo de la información sobre herramientas? – loxxy

+0

¡Sí! ir falla el propósito de información sobre herramientas: P Pero necesito algo similar información sobre herramientas para ir con el cursor :) – Jalal

Respuesta

10

Puede lograr el efecto utilizando una ventana emergente y algunas propiedades simples sobre ella. Desde el código de la ventana ...

<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> 

Y así es como se vería el código subyacente.

... 
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; 
} 
... 

Por lo tanto, desde el XAML puede ver que la ubicación emergente es relativa al rectángulo. Cuando pasa el mouse sobre el rectángulo, se vuelve visible y su posición se actualiza a medida que se mueve el mouse. Naturalmente, esta es una solución muy básica, pero con algunos ajustes menores, el manejo de eventos como "MouseEnter" y el ajuste de la propiedad, se pueden obtener algunos efectos realmente interesantes.

+0

¡Gracias! Lo implementaré tan pronto como sea posible :) – Jalal

+2

En realidad, no es necesario crear su propia información flotante con una ventana emergente, ya que la información sobre herramientas es una ventana emergente de todos modos.Simplemente configure ToolTip's HorizontalOffset y VerticalOffset en la posición actual del mouse. – henon

2

No sé si esta es una buena práctica, o si funciona bien, pero podría usar un Adorner.

He creado una prueba de concepto antes, pero no la he usado en un escenario de producción (todavía). El adorner se puede utilizar para crear algo como esto (información sobre herramientas), o un cursor de mouse personalizado o iconos de destino de caída.

Asegúrese de establecer IsHitTestVisible = false si no es necesario probar el adorno y puede aparecer directamente debajo de la ubicación del mouse.

ACTUALIZACIÓN

Basta con leer completamente la descripción de adorners:

aplicaciones comunes para adorners incluyen:

  • Adición de asas funcionales a un UIElement que permiten a un usuario para manipular el elemento de alguna manera (cambiar el tamaño, rotar, reposicionar, etc.).
  • Proporcione comentarios visuales para indicar varios estados o en respuesta a varios eventos.
  • Superposición de decoraciones visuales en un UIElement.
  • Oculta o anula visualmente parte o la totalidad de un UIElement.
0

Esto mueve la información sobre herramientas con el cursor del mouse.

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; 
    } 
+0

¿Cómo se usa ese controlador con diferentes controles? ¿Me gusta si tengo dos botones diferentes que necesitan esta funcionalidad? –

+0

Esto no funciona con el texto de información sobre herramientas definido en XAML, es decir, Stuff Además, si defino la información sobre herramientas de esta manera, ¿cómo me aseguraré de que el contenido sea correcto en el controlador de eventos? (tip.Content = ??) –

Cuestiones relacionadas