gpt4 book ai didi

wpf - UI 选项卡控制调试和部署版本之间的可见性变化

转载 作者:行者123 更新时间:2023-12-04 02:25:47 25 4
gpt4 key购买 nike

我有一个 WPF Mvvm-Light 应用程序,它使用选项卡控件向用户显示不同的 View 。

问题:

我遇到的问题是当程序第一次加载选项卡控件时显示为空。但是在本地调试时,这个问题永远不会发生。这个应用程序已经开发了一年多没有这个问题,突然间它开始发生。见下图
enter image description here

黑客修复:

如果用户调整其窗口大小,选项卡控件中的内容将刷新并出现,并且当他们打开应用程序时,问题永远不会再次发生。但是这个问题 100% 发生在第一个程序加载和第一个选项卡加载(同时发生)

细节:

这是我定义插入选项卡控件的 View 的方式

 <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>

然后在主窗口的 View 模型中,我为选项卡控件分配了一个集合,默认情况下将仪表板设置为第一个选项卡,像这样打开(试图只包含相关代码,显然在 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 diagnostics tools不要出现。下图显示了正在调试的同一个应用程序,但没有 XAML 工具框的应用程序是缺少 ui 元素的应用程序。

enter image description here

以下内容未在我的自定义选项卡控件样式中呈现:
<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 中插入了“测试”文本块以确认哪个部分没有显示。现在我有一个可怕的技巧,可以在应用程序启动时通过代码调整窗口大小,虽然可行,但我仍然想弄清楚发生了什么。

最佳答案

这很hacky,但你可以尝试这样的事情:

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 - UI 选项卡控制调试和部署版本之间的可见性变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46496828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com