我有一個畫布,我有一個圖像。我可以使用鼠標移動該圖像(拖放)。我想阻止用戶移動畫布外的圖像。WPF中的陷阱鼠標
有什麼辦法可以捕捉鼠標指針,因此它只能在畫布內移動?所以當用戶試圖將鼠標移動到畫布外時,光標將保持在畫布的邊緣。
此行爲的一個示例是移動窗口時,無法將其移動到任務欄上。當您嘗試在任務欄上移動它時,鼠標光標停留在任務欄的邊緣,拒絕在任務欄上移動。
我有一個畫布,我有一個圖像。我可以使用鼠標移動該圖像(拖放)。我想阻止用戶移動畫布外的圖像。WPF中的陷阱鼠標
有什麼辦法可以捕捉鼠標指針,因此它只能在畫布內移動?所以當用戶試圖將鼠標移動到畫布外時,光標將保持在畫布的邊緣。
此行爲的一個示例是移動窗口時,無法將其移動到任務欄上。當您嘗試在任務欄上移動它時,鼠標光標停留在任務欄的邊緣,拒絕在任務欄上移動。
經過更多搜索後,我發現user32.dll中有一個名爲ClipCursor的函數,它完全符合我的需求。
以下是捕獲鼠標光標的示例應用程序示例。單擊Button1時,光標將被限制在一個矩形中(10,10,500,500)。當按下按鈕2(或關閉應用程序)時,光標將再次釋放。
XAML:
<Window x:Class="WpfApplication1.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>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" />
</Grid>
</Window>
CS:
[DllImport("user32.dll")]
static extern void ClipCursor(ref System.Drawing.Rectangle rect);
[DllImport("user32.dll")]
static extern void ClipCursor(IntPtr rect);
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
System.Drawing.Rectangle r = new System.Drawing.Rectangle(10, 10, 500, 500);
ClipCursor(ref r);
}
private void button2_Click(object sender, RoutedEventArgs e)
{
ClipCursor(IntPtr.Zero);
}
行爲良好的應用程序不應該試圖限制鼠標指針的移動。這是用戶,而不是你的應用程序在控制中,以及你描述的行爲,當拖動窗口時,鼠標指針不能在任務欄上移動,這並不是我所經歷的。
但是,當用戶在畫布中拖動圖像時,即使用戶將鼠標指針移到畫布外部,也可以限制圖像的移動,使其保持在畫布內。
在Windows中進行拖動操作時,通常是capture the mouse。這意味着即使應用程序移出應用程序窗口,您的應用程序也會不斷接收有關鼠標指針移動的信息。
這一個是一個不錯的選擇,除了剪輯矩形的座標是相對於整個屏幕。把它限制在控制極限是很好的。 – StinkyCat
對於任何想在控件上捕捉鼠標的人,請使用給定的解決方案加上[本文的第二個答案](http://stackoverflow.com/questions/4492734/getting-the-top-left-coordinates-of-a- wpf-uielement):'Point targetLoc = this.PointToScreen(new Point(0,0)); System.Drawing.Rectangle r = new System.Drawing.Rectangle((int)targetLoc.X,(int)targetLoc.Y,(int)(targetLoc.X + this.Width),(int)(targetLoc.Y + this .Height));' – StinkyCat