Подсказка или что-то подобное перемещается с курсором в WPF
Можно ли переместить 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 ответа
Вы можете добиться эффекта, используя всплывающее окно и несколько простых свойств. Из кода окна...
<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 и корректировкой свойств, вы можете получить действительно интересные эффекты.
Я не знаю, является ли это лучшей практикой, или она хорошо работает, но вы могли бы использовать Adorner
,
Я создал доказательство концепции раньше, но не использовал его в производственном сценарии (пока). Adorner может быть использован для создания чего-то подобного (всплывающая подсказка), либо для пользовательского курсора мыши, либо для удаления целевых значков.
Убедитесь, что вы установили IsHitTestVisible = false
если рекламодатель не нуждается в проверке на удар и может появиться прямо под указателем мыши.
ОБНОВИТЬ
Просто полностью прочитайте описание украшателей:
Распространенные приложения для украшения включают в себя:
- Добавление функциональных дескрипторов в UIElement, которые позволяют пользователю каким-либо образом манипулировать элементом (изменение размера, поворот, изменение положения и т. Д.).
- Обеспечить визуальную обратную связь для обозначения различных состояний или в ответ на различные события.
- Наложение визуальных украшений на UIElement.
- Визуально замаскируйте или переопределите часть или весь элемент UIElement.
Это перемещает всплывающую подсказку с помощью курсора мыши.
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;
}