wpf - La visibilidad de control de la pestaña UI cambia entre la versión depurada y la versión implementada
vb.net mvvm (1)
Tengo una aplicación WPF Mvvm-Light que usa controles de pestañas para mostrar diferentes vistas al usuario.
PROBLEMA:
El problema que tengo es que cuando el programa se carga por primera vez, el control de pestañas se muestra vacío. Pero cuando se depura localmente, este problema nunca ocurre. Esta aplicación ha estado en desarrollo durante más de un año sin este problema y de repente comenzó a suceder. ver abajo imagen
HACK FIX:
Si el usuario cambia el tamaño de su ventana, el contenido en el control de pestañas se actualiza y aparece, y el problema nunca vuelve a ocurrir mientras tienen abierta la aplicación. Pero este problema ocurre el 100% del tiempo en la carga del primer programa y la carga de la primera pestaña (que ocurre al mismo tiempo)
DETALLES:
aquí es cómo defino mis vistas que se insertan en el control de pestañas
<DataTemplate DataType="{x:Type FtcViewModel:DashboardNavViewModel}">
<FtcView:DashboardNav />
</DataTemplate>
y aquí está mi control de pestañas:
<TabControl Grid.Column="1" Grid.Row="3"
SelectedItem="{Binding CurrentViewModel}"
ItemsSource="{Binding OpenViewModelCollection}"
Style="{StaticResource TabControlStyle}"
ItemContainerStyle="{StaticResource TabItemStyle}" >
</TabControl>
luego en mi modelo de vista para la ventana principal, asigno una colección al control de pestañas y de forma predeterminada establezco el dashbaord como la primera pestaña para abrir así (traté de incluir solo el código relevante, obvio que hay más en el archivo 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)
PREGUNTA
¿Puede alguien ayudarme a descubrir por qué sucede esto o sugerir una forma de actualizar la interfaz de usuario después de la primera carga de la aplicación?
gracias por adelantado
ACTUALIZACIÓN 1 - 4 de octubre de 2017
Pude reproducir este problema en mi máquina de desarrollo. Cuando la interfaz de usuario está en blanco, puede ver que las herramientas de diagnóstico XAML no aparecen. La imagen a continuación muestra la misma aplicación que se depura, pero la que no tiene el cuadro de herramientas XAML es la que tiene los elementos de la interfaz de usuario que faltan.
El siguiente contenido no se muestra dentro de mi estilo de control de pestañas personalizado:
<ScrollViewer VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Auto" >
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</ScrollViewer>
EDITAR 2 Oct 11 2017
Establecí puntos de interrupción tanto en el código xaml como en el ViewModel. Puedo confirmar que los datos de ViewModel están correctamente inicializados y asignados a los objetos observables. También inserté textblocks de "prueba" en mi tabItemTemplate para confirmar qué parte no se muestra. En este momento tengo un terrible truco para redimensionar la ventana desde el código al inicio de la aplicación, mientras eso funciona, aún me gustaría descubrir qué está pasando.
Esto es bastante raro, pero podrías intentar algo como esto:
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
Tenga en cuenta que esto solo automatizará el proceso de cambio de tamaño que describió.
Si quiere guardar algunas líneas porque su aplicación va a estar a pantalla completa una vez cargada, puede omitir algunas líneas y hacer esto en su lugar:
Public Sub YourFormName.OnLoad()
YourFormName.Size = New Size(300, 300)
System.Threading.Thread.Sleep(1000)
YourFormName.WindowState = System.Windows.Forms.FormWindowState.Maximized
End Sub