Мне нужно использовать пользовательский курсор для перетаскивания. Изначально я использовал Adorner, но теперь я хотел бы иметь возможность показывать его также при перемещении между окнами, или даже если есть одно окно, чтобы не вырезать курсор на полях окна, поэтому я пытаюсь использовать ответы здесь .
Пока я перемещаю курсор за пределы окна, которое является единственным окном в этом тестовом приложении, события MouseMove
не генерируются. События MouseMove
снова возникают, когда я перемещаю курсор в окне.
Я пытался это и это безуспешно. Я также прочитал официальную документацию .
XAML:
<Window x:Class="cs_wpf_test_9.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:cs_wpf_test_9"
mc:Ignorable="d"
Title="MainWindow" Height="127" Width="269"
Loaded="Window_Loaded"
MouseMove="Window_MouseMove">
<Label HorizontalAlignment="Center" VerticalAlignment="Center">Testing</Label>
</Window>
Код-за:
namespace cs_wpf_test_9
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public static Point GetMousePositionWindowsForms()
{
System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
return new Point(point.X, point.Y);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Mouse.Capture(this);
}
internal void UpdateCursorPos()
{
Point p = GetMousePositionWindowsForms();
// Tracepoint here to show {p}
}
private void Window_MouseMove(object sender, MouseEventArgs e)
{
UpdateCursorPos();
}
}
}
Ожидается: на панели «Вывод» должны быть выходные данные обработчика события MouseMove для каждого движения мыши, в том числе когда мышь перемещалась за пределы окна.
Факт: обработчик события вызывается только тогда, когда мышь перемещается внутри окна.
Обновление: Если я установил для AllowDrop в окне значение true, а для MouseDown, я вызываю DoDragDrop, обработчик DragOver вызывается только тогда, когда курсор мыши находится над окном, хотя мышь принудительно захватывается с помощью метод CaptureMouse UIElement. Для меня было бы достаточно, чтобы событие DragOver работало так, как я объяснил выше, потому что то, что я хочу реализовать, - это лучшее перетаскивание. Я тоже пытался поставить:
Mouse.Capture(this, CaptureMode.Element);
CaptureMouse();
перед вызовом DoDragDrop, но происходит то же самое.