2013-04-15 96 views
0

我有以下窗口,其中包含我的用户控件在上方区域(取决于进程的状态)和一个按钮。点击按钮后,一个用户控件将被隐藏,另一个将被显示。通过从第一个控件到第二个控件的更改,窗口被冻结,直到第二个控件完成任务。WPF:在用户交互后显示和隐藏用户控件

第二个控件包含一个记录步骤的ListView。我想在这个过程中直接看到这个日志。但是,只有完成时我才能看到它。在第二个控件开始工作之前,如何刷新窗口?

码字行像

Me.UpdateLayout() 

不工作...

整个程序shalls与三个屏幕(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 

感谢任何回应。

编辑: 该方案包括三个步骤。在第一步中将配置做什么。

Step 1: configure

:点击右下角按钮将被做了每个标记的项目(绿色按钮,红色将被忽略),由第二个步骤的列表中显示。

Step 2: logging

如果步骤2完成完成屏幕被示出,并且程序可以关闭(该屏幕仍设计)。

Step 3: finish

在WinForms和ASP.NET我显示和隐藏用户控件也是在我这样做时间的方式(也可能这不是一个很好的实施前)。如果在WPF中有更好的可能性,那将会很好。这里

+0

我不知道你在做什么,但你的代码是一团糟(没有冒犯)。您不得在WPF代码中操作UI元素的属性。发布你需要的截图,我可以告诉你在WPF中实现它的正确方法。 –

+0

如果我回到办公室,我会明天发布截图。 – mburm

+0

添加屏幕截图。 – mburm

回答

0

你的问题是你的UI线程这是可以更新您的视图中显示的内容只有一个/窗口忙于运行你的

Me.ucSettings.Converters.FindAll(Function(item) item.DoUpgrade).ForEach(Sub(item) item.Upgrade()) 

^^的功能,因此不能更新视图/渲染元素,直到完成。

A“欺骗”之类的明确表明这(只是用这个作为信息,在你的代码不使用它)

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按钮被按下时, 。但您仍然有无响应用户界面的问题。

您需要从主线程中使用诸如BackgroundWorkers之类的东西来处理您在代码隐藏方面做些什么以保持UI响应,然后每当需要更新UI控件时都要相应地通知UI线程。