【问题标题】:WPF window UI not updatingWPF 窗口 UI 未更新
【发布时间】:2012-12-09 18:08:20
【问题描述】:

我正在尝试创建一个对话框,显示将某些账单数据从 WPF VB.NET 应用程序加载到 Word 的过程。问题是 WPF UI 没有更新以显示更改。

WPF 代码是:

    <StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" >
        <TextBlock Name="StatusDisplayTextBlock" Text="Printing 30 of 40 to document......" FontSize="20"/>
        <ProgressBar Name="PrintProgressBar1" Height="30" Width="400" Margin="0,10,0,0"/>
    </StackPanel>

VB.NET 代码:

Imports Microsoft.Office.Interop

Public Class PrintingToDocx
    Dim IsWorkDone As Boolean = False
    Public Enum BillPrintMode
        InOne = 0
        Seperate = 1
    End Enum

    Private BrowserBills As New List(Of Classes.BillsNS.BilBrowserClass)
    Private Bills As New List(Of Classes.BillsNS.BillClass)
    Private PrintMode As BillPrintMode

    Private Sub PrintingToDocx_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
        If IsWorkDone = False Then
            e.Cancel = True
        End If
    End Sub

    Public Sub New(ByVal BrowserBills As List(Of Classes.BillsNS.BilBrowserClass), ByVal Mode As BillPrintMode)
        InitializeComponent()
        Me.BrowserBills = BrowserBills
        PrintMode = Mode
    End Sub

    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        GetBills()
        If PrintMode = BillPrintMode.InOne Then
            PrintInOne()
            ' IsWorkDone = True
        Else
            Dim count As Integer = 0
            For Each k In Bills
                count = count + 1
                StatusDisplayTextBlock.Text = "Writing Bill " & count & " of " & Bills.Count & " to WORD....."
                DataAccessModuleNS.Reports.PrintaBill(k)
            Next
            IsWorkDone = True
        End If
        Me.Close()
    End Sub

    Private Sub GetBills()
        Me.Focus()
        StatusDisplayTextBlock.Text = "Reading Bills Data...."
        Dim count As Integer = 1
        For Each k In BrowserBills
            Bills.Add(DataAccessModuleNS.Bills.GetBill(k.ID.ToString))
            StatusDisplayTextBlock.Text = "Reading Bill " & count & " of " & BrowserBills.Count & "...."
            'count = count + 1
            count += 1
        Next
    End Sub

    Private Sub PrintInOne()
        Try
            StatusDisplayTextBlock.Text = "Writing Bill " & "0" & " of " & Bills.Count & " to WORD....."

            Dim oWord As Word.Application
            Dim oDoc As Word.Document
            Dim oTable As Word.Table

            Me.Focus()
            'Start Word and open the document template.
            oWord = CreateObject("Word.Application")
            oWord.Visible = False
            oDoc = oWord.Documents.Add
            Dim countBills As Integer = 0
            For Each Bill In Bills
                'To Addressing Fields
                countBills = countBills + 1
                StatusDisplayTextBlock.Text = "Writing Bill " & countBills & " of " & Bills.Count & " to WORD....."

    End Sub
End Class

问题是这样的: 如果工作正常,则功能,但直到所有处理完成后 UI 才会显示。以下是处理 word 时任务栏的示例图像:

当工作完成后,它会像这样正常工作:

以下是报告

编辑:我现在使用了后台工作人员,但现在的问题是,当进度发生变化并且我尝试更新 UI 线程上的 TextBlock 时,我收到无法在不同线程上执行操作的错误。以下是我在 ProgressChanged 事件中使用的代码。

Private Sub BackgroundWorker_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
    'Throw New NotImplementedException
    StatusDisplayTextBlock.Text = e.UserState
End Sub

能否请您帮我弄清楚如何更新 UI 线程。

【问题讨论】:

  • 看起来您正在 UI 线程中执行所有操作。你应该避免这样做。
  • ok @RichardOD 我会尝试使用 BackGroundWorker 并更新 POST。
  • 天哪,这是我很久以来看到的最长的无用问题 - 所有信息都在最后的编辑中,问题的另一部分只包含零相关信息。除了很多代码甚至截图。不过嘿嘿,有个例外,我们忽略吧。
  • 对于一个新手来说,一切都很艰难,否则我可以选择删除提问。

标签: wpf vb.net user-interface


【解决方案1】:

您需要从 UI 线程中移动逻辑操作...

最好的解决方案是使用 Backgroundworker 类将所有操作与 UI 分开。 可以在这里找到很好的教程 [link]

如果通过更改您可以使用 .NET 4.5,您可以简单地使用 Async-Await 模式 [Async in VB]

【讨论】:

  • 谢谢。我在 .Net4 中,问题已解决,但是我收到一个错误,即“调用线程必须是 sta”;我会研究它,如果我失败了,我会发布一个解决方案。谢谢。
  • 只要记住对 UI 元素的所有操作都需要在 UI 线程中完成。最简单的方法是用 Dispatcher.Invoke(...) 包装它。
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多