2011-09-28 17 views
7

Czy można przesunąć kursor myszy Tooltip lub coś w tym stylu, gdy mysz znajdzie się na określonym elemencie sterującym?Etykieta narzędziowa lub coś podobnego z kursorem w WPF

Próbowałem TextBlock, ale właściwość Margin nie działa.

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

Pokaż swój kod, a prawdopodobnie zobaczymy Twoje zamiary. –

+0

czy chcesz, aby podpowiedź poruszała się razem z kursorem myszy? Jeśli tak, to czy nie jest to niezgodne z celem podpowiedzi? – loxxy

+0

Tak! ir nie spełnia celu podpowiedzi: P Potrzebuję jednak podobnej podpowiedzi do kursora :) – Jalal

Odpowiedz

10

Efekt można uzyskać za pomocą wyskakującego okienka i kilku prostych właściwości. Z kodu okna ...

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

I tak będzie wyglądał kod.

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

Tak więc z XAML widać, że umieszczenie wyskakującego okienka jest względne w stosunku do prostokąta. Kiedy przesuniesz się po prostokącie, staje się widoczny, a jego pozycja jest aktualizowana wraz z ruchem myszki. Oczywiście jest to bardzo podstawowe rozwiązanie, ale z kilkoma drobnymi usprawnieniami, obsługą zdarzeń takich jak "MouseEnter" i dopasowaniem właściwości, możesz wymyślić kilka naprawdę fajnych efektów.

+0

Dziękuję! Zaimplementuję go tak szybko, jak to możliwe :) – Jalal

+2

Właściwie nie trzeba tworzyć własnych pływających etykiet narzędzi za pomocą wyskakującego okienka, ponieważ i tak ToolTip to Popup.Wystarczy, że ustawisz HorizontalOffset narzędzia ToolTip i VerticalOffset na bieżącą pozycję myszy. – henon

2

Nie wiem, czy jest to najlepsza praktyka, czy też działa dobrze, ale można użyć numeru Adorner.

Stworzyłem wcześniej dowód koncepcji, ale nie wykorzystałem go w scenariuszu produkcji (jeszcze). Adornera można użyć do stworzenia czegoś podobnego (tooltip) lub niestandardowego kursora myszy lub ikon celu docelowego.

Upewnij się, że ustawiłeś IsHitTestVisible = false, jeśli adorner nie musi zostać przetestowany i może pojawić się bezpośrednio pod lokalizacją myszy.

UPDATE

Wystarczy pełni zapoznania się z opisem adorners:

Wspólne wnioski o adorners obejmują:

  • Dodawanie uchwyty funkcjonalne do UIElement które umożliwiają użytkownikowi manipulować element w jakiś sposób (zmiana rozmiaru, obrót, zmiana położenia itd.).
  • Zapewnij wizualną informację zwrotną, aby wskazać różne stany lub w odpowiedzi na różne zdarzenia.
  • Nakładaj dekoracje wizualne na UIElement.
  • Wizualnie zamaskuj lub pomiń część lub całość UCIEN.
0

Porusza kursor myszką.

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

Jak korzystać z tego handlerka z różnymi kontrolkami? Podobnie jak jeśli mam dwa różne przyciski, które wymagają tej funkcji? –

+0

To nie działa z tekstem podpowiedzi zdefiniowanym w XAML, tj. Rzeczy Ponadto, jeśli zdefiniuję etykietkę narzędzia w ten sposób, w jaki sposób upewnię się, że zawartość jest poprawna w procedurze obsługi zdarzeń? (tip.Content = ??) –

Powiązane problemy