2013-04-15 95 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線程。