wpf - 調試和部署版本之間的UI選項卡控件可見性更改



vb.net mvvm (1)

這是相當不好的,但你可以嘗試這樣的事情:

Public Sub YourFormName.OnLoad ()
    Dim CorrectFormSize As Intager = YourFormName.Size
    YourFormName.Size = New Size(300, 300)
    System.Threading.Thread.Sleep(1000)
    YourFormName.Size = New Size(CorrectFormSize)
End Sub

請記住,這只會自動執行您所描述的調整大小流程。

如果你想保存幾行,因為你的應用程序將被加載一次全屏,那麼你可以跳過幾行,而不是這樣做:

Public Sub YourFormName.OnLoad()
    YourFormName.Size = New Size(300, 300)
    System.Threading.Thread.Sleep(1000)
    YourFormName.WindowState = System.Windows.Forms.FormWindowState.Maximized
End Sub

我有一個WPF Mvvm-Light應用程序,它使用選項卡控件向用戶顯示不同的視圖。

問題:

我的問題是,當程序第一次加載選項卡控件顯示為空。 但是在本地調試時,這個問題永遠不會發生 這個應用程序已經發展了一年多,沒有這個問題,突然之間開始發生。 見下圖

HACK FIX:

如果用戶調整其窗口大小,則選項卡控件中的內容會刷新並顯示,並且在應用程序打開時問題不會再次出現。 但是,第一個程序加載和第一個標籤加載(發生在同一時間)的時間是100%

細節:

這裡是我如何定義我的意見,插入到選項卡控件

 <DataTemplate DataType="{x:Type FtcViewModel:DashboardNavViewModel}">
   <FtcView:DashboardNav  />
 </DataTemplate>

這裡是我的選項卡控制:

<TabControl  Grid.Column="1" Grid.Row="3" 
                     SelectedItem="{Binding CurrentViewModel}" 
                     ItemsSource="{Binding OpenViewModelCollection}" 
                     Style="{StaticResource TabControlStyle}" 
                     ItemContainerStyle="{StaticResource TabItemStyle}" >
        </TabControl>

然後在我的視圖模型的主窗口我分配一個集合的選項卡控制,並默認設置作為第一個選項卡打開這樣的dashbaord(試圖只包括相關的代碼,在viewModel文件中有更多的):

Public Property OpenViewModelCollection As ObservableCollection(Of ViewModelHelper)
    Get
        Return Me._OpenViewModelCollection
    End Get
    Set(value As ObservableCollection(Of ViewModelHelper))
        If _OpenViewModelCollection Is value Then
            Return
        End If
        _OpenViewModelCollection = value
        RaisePropertyChanged(OpenViewModelCollectionPropertyName)
    End Set
End Property

Public Property CurrentViewModel As ViewModelHelper
            Get
                Return Me._CurrentViewModel
            End Get
            Set(value As ViewModelHelper)
                If _CurrentViewModel Is value Then
                    Return
                End If
                ''if change of viewmodel is not from OpenTabViewModelCommandExecute method
                If FlagOpening = False AndAlso value IsNot Nothing Then

                    If _CurrentViewModel IsNot Nothing Then
                        _CurrentViewModel.HandleNavigation(True)
                    End If

                    ''Mark NavService target VM
                    _NavService.TargetViewModelKey = value.vmKey

                    ''evaluate if naviagtion has been canceled
                    If _NavService.bCanNavigate = False Then
                        _NavService.bCanNavigate = True
                        Exit Property
                    End If
                End If
                ''if navigation not canceled, finish assigning new view model
                _CurrentViewModel = value
                RaisePropertyChanged(CurrentViewModelPropertyName)
                If _CurrentViewModel IsNot Nothing Then
                    _CurrentViewModel.RefreshModel()
                End If
            End Set
        End Property
...

'' THIS CODE IS FROM THE CONSTRUCTOR OF THE VIEW MODEL CLASS
OpenViewModelCollection.Add(_Locator.DashboardHome_VM)
CurrentViewModel = OpenViewModelCollection(0)

有人可以幫我弄清楚為什麼會發生這種情況,或者建議在第一次加載應用程序後刷新UI。

提前致謝

更新1 - 2017年10月4日

我已經能夠在我的開發機器上重現這個問題。 當UI為空時,可以看到XAML診斷工具不顯示。 下面的圖片顯示了正在調試的應用程序,但是沒有XAML工具箱的那個應用程序是缺少UI元素的應用程序。

以下內容不在我的自定義選項卡控件樣式中呈現:

<ScrollViewer VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Auto" >
    <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</ScrollViewer>

編輯2017年10月11日

我已經在ViewModel的xaml和代碼中設置了斷點。 我可以確認ViewModel數據已正確初始化並分配給可觀察對象。 我還在我的tabItemTemplate中插入了“test”文本框來確認哪個部分沒有顯示。 現在我在應用程序啟動時從代碼的大小調整窗口的可怕的黑客,雖然這工作,我仍然想弄清楚是怎麼回事。