ExpanderView 在页面导航后展开
ExpanderView is expanded after page navigation
我在我的 UWP
应用程序中使用 WPF
ExpanderView
(ExpanderRT) 的一个端口来显示带有项目的可扩展 headers。当应用程序首次启动并且 MainPage
已初始化时,这可以正常工作。但是,如果我导航到一个新页面,然后返回到 MainPage
,ExpanderView
看起来像展开了,但它没有显示项目。它看起来应该与首次初始化 MainPage
时一样。我捕获了一个 GIF
来显示行为。
这是 MainPage
上 UserControl
的 XAML
;
<ListView x:Name="CategoriesListView" ScrollViewer.VerticalScrollBarVisibility="Hidden">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ListViewItemPresenter ContentMargin="0" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:Category">
<expander:ExpanderControl
x:Name="expander_Main"
ItemsSource="{x:Bind childItems}"
Expanded="Expanded" />
</DataTemplate>
</ListView.ItemTemplate>
这是我用来导航的EventHandler
;
private void OnSettingsButtonChecked(object sender, RoutedEventArgs e)
{
ShellSplitView.IsPaneOpen = false;
ViewModel.NavigationService.Navigate(typeof(SettingsPage));
}
如果你们中有人知道为什么 ExpanderView
有如此奇怪的行为,请给我提示 - 如果您需要,我可以提供更多我的代码。
[更新]
我注意到只有当我在移动设备(智能手机或移动 Windows 10 模拟器)上 运行 应用程序时才会出现此行为。如果我在本地机器上执行应用程序,ExpanderView
工作正常。当我使用后退按钮导航回 MainPage
时,它按预期工作 - 我不知道如何解决这个问题,这真的很奇怪。
在调试 ExpanderRT
控件的全部代码后,我能够解决问题!这是由移植到 WinRT
的原始 Expander 控件的错误引起的
我发现,class ExpanderControl.cs
中 _itemsCanvas
的高度是通过以下方法设置的:
private void OnPresenterSizeChanged(object sender, SizeChangedEventArgs e)
{
if (null != _itemsCanvas && null != _presenter && IsExpanded)
{
_itemsCanvas.Height = _presenter.DesiredSize.Height;
}
}
这导致项目容器的大小仅在 ExpanderView
当前展开时应用。当ExpanderView
当前未展开时,我只是添加了以下条件以将项目容器的高度设置为0。
else if (null != _itemsCanvas && null != _presenter && !IsExpanded)
{
_itemsCanvas.Height = 0;
}
我对控件进行了各种改进以利用新的 UWP 功能,因此如果有人对 UWP 兼容版本感兴趣,请随时与我联系。
更新
我为 UWP 的更新 ExpanderControl 创建了一个 GitHub Repo
我在我的 UWP
应用程序中使用 WPF
ExpanderView
(ExpanderRT) 的一个端口来显示带有项目的可扩展 headers。当应用程序首次启动并且 MainPage
已初始化时,这可以正常工作。但是,如果我导航到一个新页面,然后返回到 MainPage
,ExpanderView
看起来像展开了,但它没有显示项目。它看起来应该与首次初始化 MainPage
时一样。我捕获了一个 GIF
来显示行为。
这是 MainPage
上 UserControl
的 XAML
;
<ListView x:Name="CategoriesListView" ScrollViewer.VerticalScrollBarVisibility="Hidden">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ListViewItemPresenter ContentMargin="0" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:Category">
<expander:ExpanderControl
x:Name="expander_Main"
ItemsSource="{x:Bind childItems}"
Expanded="Expanded" />
</DataTemplate>
</ListView.ItemTemplate>
这是我用来导航的EventHandler
;
private void OnSettingsButtonChecked(object sender, RoutedEventArgs e)
{
ShellSplitView.IsPaneOpen = false;
ViewModel.NavigationService.Navigate(typeof(SettingsPage));
}
如果你们中有人知道为什么 ExpanderView
有如此奇怪的行为,请给我提示 - 如果您需要,我可以提供更多我的代码。
[更新]
我注意到只有当我在移动设备(智能手机或移动 Windows 10 模拟器)上 运行 应用程序时才会出现此行为。如果我在本地机器上执行应用程序,ExpanderView
工作正常。当我使用后退按钮导航回 MainPage
时,它按预期工作 - 我不知道如何解决这个问题,这真的很奇怪。
在调试 ExpanderRT
控件的全部代码后,我能够解决问题!这是由移植到 WinRT
我发现,class ExpanderControl.cs
中 _itemsCanvas
的高度是通过以下方法设置的:
private void OnPresenterSizeChanged(object sender, SizeChangedEventArgs e)
{
if (null != _itemsCanvas && null != _presenter && IsExpanded)
{
_itemsCanvas.Height = _presenter.DesiredSize.Height;
}
}
这导致项目容器的大小仅在 ExpanderView
当前展开时应用。当ExpanderView
当前未展开时,我只是添加了以下条件以将项目容器的高度设置为0。
else if (null != _itemsCanvas && null != _presenter && !IsExpanded)
{
_itemsCanvas.Height = 0;
}
我对控件进行了各种改进以利用新的 UWP 功能,因此如果有人对 UWP 兼容版本感兴趣,请随时与我联系。
更新
我为 UWP 的更新 ExpanderControl 创建了一个 GitHub Repo