.net 防止光标在WPF代码内更改的messagebox

.net 防止光标在WPF代码内更改的messagebox,.net,wpf,vb.net,.net,Wpf,Vb.net,在我的wpf项目中,我使用以下代码更改鼠标光标: 调用(新SetCursorCallback(SetCursor的地址),新 对象(){Cursors.Wait}) 定义如下: 委托子集合CursorCallback(ByVal[CursorType]作为 System.Windows.Input.Cursor) 在一个处理按键的子程序中,我检查按下的键是否为删除键,如果为真,我使用消息框提示用户确认他们要删除所选条目 删除所选条目可以正常工作,但可能需要一些时间 因此,我称之为 调用(新Set

在我的wpf项目中,我使用以下代码更改鼠标光标:

调用(新SetCursorCallback(SetCursor的地址),新 对象(){Cursors.Wait})

定义如下:

委托子集合CursorCallback(ByVal[CursorType]作为 System.Windows.Input.Cursor)

在一个处理按键的子程序中,我检查按下的键是否为删除键,如果为真,我使用消息框提示用户确认他们要删除所选条目

删除所选条目可以正常工作,但可能需要一些时间

因此,我称之为

调用(新SetCursorCallback(SetCursor的地址),新 对象(){Cursors.Wait})

在长时间运行的删除代码开始之前将光标更改为等待图标的代码,以及在长时间运行的代码完成时将相同代码的值更改为Cursors.Arrow的代码

但是,光标不会改变

我在SetCursor例程中放置了一个console.writeline,以确认它正在执行,并且它正在执行(当调用游标以将其更改为等待时,以及再次将其更改回箭头时)

如果我从等式中删除messagebox提示符,光标将按预期变化。光标会改变。我无法理解为什么消息框阻止光标更改

以下是带有消息框的代码:

如果MessageBox.Show(“是否要删除所选条目?”, “我的程序名-删除”,MessageBoxButton.YesNo, MessageBoxImage.Question)=MessageBoxResult。然后是

            Me.Dispatcher.Invoke(New SetCursorCallback(AddressOf SetCursor), New Object() {Cursors.Wait})

           ... some code ...  

        End If
我还尝试在消息框的if语句内设置一个标志,并将光标更改为消息框的if语句的外侧。它不起作用,在子计数器中运行messagebox似乎停止了对光标的更改

我还在msgboxif语句中尝试了me.focus命令,但没有效果

我还尝试将me.cursor语句更改为xxx.cursor,其中xxx在窗口加载时全局设置为“me”

我还尝试使用winform msgbox语句

唯一允许光标更改代码工作的方法是不使用消息框进行提示

我正在使用VS 2015社区版


在这一点上,我没有主意了,任何帮助都将不胜感激。

好-所以这并不漂亮,但为了解决这个问题,当用户单击messagebox的“Ok”按钮时,我将鼠标指针从屏幕上的任何位置跳到wpf的windows列表框的中心

现在将鼠标指针放在wpf窗口列表框上,然后将图标更改为等待符号并运行长时间运行的代码

这是有效的-如预期的那样显示等待图标-唯一的问题是用户必须在视觉上搜索鼠标指针移动到的位置(这是两个缺点中较小的缺点-更大的缺点是在调用等待鼠标指针时鼠标图标保持不变)

下面是我用来跳转鼠标光标的代码:

Dim MyCursor=New Forms.Cursor(Forms.Cursor.Current.Handle)


MyCursor.Position=New System.Drawing.Point(Me.Left+MyListView.Margin.Left+MyListView.ActualWidth/2,Me.Top+MyListView.Margin.Top+MyListView.ActualHeight/2)

在您的消息框代码中,如果您只需执行
Me.Cursor=Cursors。等待
是否有效?否-抱歉,我也试过了。1)您的
some code
是UI线程上的长时间运行事件吗?如果是,您为什么不使用后台进程?2) 虽然不建议这样做,但您可以在光标更改之后和
某些代码之前尝试执行
System.Windows.Forms.Application.DoEvents()
,以查看UI是否更新是,将System.Windows.Forms.Application.DoEvents()添加到您建议的正确位置!非常感谢你。然而,我仍然不知道为什么;正如您所指出的,wpf应用程序不推荐使用这种方法(尽管我可能不得不接受它)。再次感谢。。。。校正这很奇怪,因此System.Windows.Forms.Application.DoEvents()似乎与此无关。如果当弹出框出现时,它出现在listview表上,然后当我单击“是”删除记录时,messagebox消失,并显示等待光标。但是,如果当messagebox出现时,它不在listview上,我单击“是”删除记录,则不会显示等待光标
            Me.Dispatcher.Invoke(New SetCursorCallback(AddressOf SetCursor), New Object() {Cursors.Wait})

           ... some code ...  

        End If