我有以下窗口,其中包含我在上部区域的用户控件(取决于进程的状态)和一个按钮。单击按钮后,将隐藏一个用户控件,并显示另一个用户控件。通过从第一个控件到第二个控件的更改,窗口被冻结,直到第二个控件完成任务。
第二个控件包含一个记录步骤的ListView。我希望在此过程中直接看到此日志记录。但是我只有在完成所有的时候才能看到它。如何在第二个控件启动之前刷新窗口是否可行?
像
这样的代码行Me.UpdateLayout()
不起作用......
整个程序应该是一个具有三个屏幕的更新工具(1.设置,2。更新过程的记录,3。完成对话框)。因此,我需要在完成后直接了解日志记录的单个步骤。
我目前的XAML如下:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:SiS.Controls="clr-namespace:SiSConverter"
Title="Konvertierung von SiS-Anwendungen"
Height="400" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="50px" />
</Grid.RowDefinitions>
<SiS.Controls:Settings x:Name="ucSettings" />
<SiS.Controls:Upgrade x:Name="ucUpgrade" />
<SiS.Controls:Finish x:Name="ucFinish" />
<Button Name="btnContinue" Width="100px" Height="30px" Grid.Row="1" Margin="0,0,10,0" HorizontalAlignment="Right" />
</Grid>
</Window>
背后的相应代码:
Class MainWindow
Private _Step As Integer = -1
Private Property [Step] As Integer
Get
Return _Step
End Get
Set(value As Integer)
_Step = value
Me.ucSettings.Visibility = Visibility.Collapsed
Me.ucUpgrade.Visibility = Visibility.Collapsed
Me.ucFinish.Visibility = Visibility.Collapsed
Me.btnContinue.Content = "Weiter"
Select Case _Step
Case 0
Me.ucSettings.Visibility = Visibility.Visible
Case 1
Me.ucUpgrade.Visibility = Visibility.Visible
Case 2
Me.ucFinish.Visibility = Visibility.Visible
Me.btnContinue.Content = "Beenden"
Case Else
End Select
Me.UpdateLayout() 'doesn't work
End Set
End Property
Private Sub MainWindow_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
Me.Step = 0
For Each Item As System.IO.FileInfo In New System.IO.DirectoryInfo("Converters").GetFiles()
Dim oConverter As ISiSConverter = System.Reflection.Assembly.LoadFrom(Item.FullName).CreateInstance("Upgrade.Main", True)
Me.ucSettings.Converters.Add(oConverter)
Next
End Sub
Private Sub btnContinue_Click(sender As Object, e As RoutedEventArgs) Handles btnContinue.Click
Select Case Me.Step
Case 0 'Einstellungen
Me.Step += 1
Me.btnContinue.IsEnabled = False
Me.ucSettings.Converters.FindAll(Function(item) item.DoUpgrade).ForEach(Sub(item) item.Upgrade())
Me.btnContinue.IsEnabled = True
Case 1 'Upgrade
Me.Step += 1
Case 2 'Abschluss
Me.Close()
Case Else
End Select
End Sub
End Class
感谢您的回复。
修改 该计划包括三个步骤。在第一步中将配置要执行的操作。
点击右下角的按钮将为每个标记的项目做一些事情(绿色按钮,红色将被忽略),这将显示在第二步列表中。
如果完成第2步,则显示完成屏幕并关闭程序(此屏幕仍在设计中)。
在WinForms和ASP.NET中,我也按照我这次的方式显示和隐藏用户控件(也许这不是一个好的实现之前)。如果在WPF中有更好的可能性,那就太好了。
答案 0 :(得分:0)
你的问题是你的UI线程,它是唯一一个可以更新你的视图/窗口显示的元素太忙了你的
Me.ucSettings.Converters.FindAll(Function(item) item.DoUpgrade).ForEach(Sub(item) item.Upgrade())
^^函数,因此在完成之前无法更新视图/渲染元素。
明确表示这种“作弊”类型(只需将其用作信息,不要在代码中使用它)
Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background,
Sub()
Me.ucSettings.Converters.FindAll(Function(item) item.DoUpgrade).ForEach(Sub(item) item.Upgrade())
End Sub)
^^单击按钮时会显示新的UserControl
。但是,您仍然存在无响应UI的问题。
您需要通过使用BackgroundWorkers之类的内容来查看主线程中的卸载工作,以便从代码隐藏中执行操作以保持UI响应,然后在需要更新UI控件时通知UI线程相应