Dispatcher.BeginInvoke Error in VB but not C#

本文关键字:but not VB in BeginInvoke Error Dispatcher | 更新日期: 2023-09-27 18:35:27

嘿,我正在使用一些用C#编写的UIAutomation代码。所以我把它转换成 VB.net 这样我就可以把它集成到我自己正在制作的程序中。

有错误的代码是以下行:

Private Sub LogMessage(message As String)
    Dispatcher.BeginInvoke(DispatcherPriority.Normal, New SetMessageCallback(AddressOf DisplayLogMessage), message)
End Sub

错误出在调度程序上。BeginInvoke 指出错误 1 对非共享成员的引用需要对象引用。。

C# 中的代码如下所示:

private void LogMessage(string message)
{
    this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetMessageCallback(DisplayLogMessage), message);
}

并且没有错误,工作正常。

VB.net 版本中缺少什么才能使其正常工作?

原始 C# 代码可以在这里找到。

我转换后的 C# 到 VB.net 代码如下所示:

Imports System.Threading
Imports Automation = System.Windows.Automation
Imports System.Windows.Automation
Imports System.Windows.Threading
Public Class Form1
    Public Delegate Sub SetMessageCallback(ByVal [_Msg] As String)
    Private Sub Automate()
        LogMessage("Getting RootElement...")
        Dim rootElement As AutomationElement = AutomationElement.RootElement
        If rootElement IsNot Nothing Then
            LogMessage("OK." + Environment.NewLine)
            Dim condition As Automation.Condition = New PropertyCondition(AutomationElement.NameProperty, "UI Automation Test Window")
            LogMessage("Searching for Test Window...")
            Dim appElement As AutomationElement = rootElement.FindFirst(TreeScope.Children, condition)
            If appElement IsNot Nothing Then
                LogMessage("OK " + Environment.NewLine)
                LogMessage("Searching for TextBox A control...")
                Dim txtElementA As AutomationElement = GetTextElement(appElement, "txtA")
                If txtElementA IsNot Nothing Then
                    LogMessage("OK " + Environment.NewLine)
                    LogMessage("Setting TextBox A value...")
                    Try
                        Dim valuePatternA As ValuePattern = TryCast(txtElementA.GetCurrentPattern(ValuePattern.Pattern), ValuePattern)
                        valuePatternA.SetValue("10")
                        LogMessage("OK " + Environment.NewLine)
                    Catch
                        WriteLogError()
                    End Try
                Else
                    WriteLogError()
                End If
                LogMessage("Searching for TextBox B control...")
                Dim txtElementB As AutomationElement = GetTextElement(appElement, "txtB")
                If txtElementA IsNot Nothing Then
                    LogMessage("OK " + Environment.NewLine)
                    LogMessage("Setting TextBox B value...")
                    Try
                        Dim valuePatternB As ValuePattern = TryCast(txtElementB.GetCurrentPattern(ValuePattern.Pattern), ValuePattern)
                        valuePatternB.SetValue("5")
                        LogMessage("OK " + Environment.NewLine)
                    Catch
                        WriteLogError()
                    End Try
                Else
                    WriteLogError()
                End If
            Else
                WriteLogError()
            End If
        End If
    End Sub
    Private Function GetTextElement(parentElement As AutomationElement, value As String) As AutomationElement
        Dim condition As Automation.Condition = New PropertyCondition(AutomationElement.AutomationIdProperty, value)
        Dim txtElement As AutomationElement = parentElement.FindFirst(TreeScope.Descendants, condition)
        Return txtElement
    End Function
    Private Sub DisplayLogMessage(message As String)
        TextBox1.Text += message
    End Sub
    Private Sub LogMessage(message As String)
        Me.Dispatcher.BeginInvoke(DispatcherPriority.Normal, New SetMessageCallback(AddressOf DisplayLogMessage), message)
    End Sub
    Private Sub WriteLogError()
        LogMessage("ERROR." + Environment.NewLine)
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim automateThread As New Thread(New ThreadStart(AddressOf Automate))
        automateThread.Start()
    End Sub
End Class

Dispatcher.BeginInvoke Error in VB but not C#

找到了正确的方法:

Private Sub LogMessage(message As String)
    Me.BeginInvoke(New SetMessageCallback(AddressOf DisplayLogMessage), message)
End Sub

感谢@HansPassant的帮助。

Dispatcher可以是静态的。我认为你需要Me.Dispatcher.