动态生成的页面不加载实际页面 content/code
Dynamically made pages don't load actual page content/code
我正在尝试创建一种加载页面的模块化方式,每个页面在主 window header 中都有自己的导航菜单项和一个单独的框架,以便始终将它们加载到内存中(以及播放精美的动画等)
这是包含已加载页面的 class。
public sealed class PageContainer : Frame
{
public string Title;
public PageContainer(string Page, bool CustomUri = false)
{
Visibility = System.Windows.Visibility.Collapsed;
NavigationUIVisibility = NavigationUIVisibility.Hidden;
Title = Page;
if(!CustomUri)
{
Navigate($"pack://lotus:,,,/Views/UserPages/{Page}.xaml", UriKind.Relative);
}
else
{
//todo
}
Console.WriteLine($"Navigation Item created {Title} with ?CustomUri: {CustomUri}");
}
public bool Visible
{
get => Visibility == System.Windows.Visibility.Visible;
set => Visibility = value ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
}
}
下面是我如何创建 PageContainer
Animations.PageTransitionAnimations AnimationLibrary;
public double _SlideAnimationLenght = 250;
public MainWindow()
{
InitializeComponent();
//Initialize Animation Library
AnimationLibrary = new Animations.PageTransitionAnimations(this);
InitializePage("Library");
InitializePage("Preferences");
InitializePage("Plugins");
InitializePage("Information");
foreach(PageContainer pp in LoadedContainers)
{
pp.Visible = true;
pp.BeginAnimation(MarginProperty, AnimationLibrary.ToLeft);
}
}
//Load a page and add it to navigation bar, if NoHeader, then don't add it to navigation
private void InitializePage(string page, bool noHeader = false)
{
if(!noHeader)
{
//Add page to navigation bar and set style
NavigationHeader.Children.Add(new NavigationItem(page)
{
Style = FindResource("HeaderMenu") as System.Windows.Style
});
}
//Add Page to PageContainer and Initialize it
PageContainer _page = new PageContainer(page);
_containers.Add(_page);
PagesContainer.Children.Add(_page);
}
//Public LoadedContainers, no setter
private List<PageContainer> _containers = new List<PageContainer>();
public List<PageContainer> LoadedContainers => _containers;
发生的情况是PageContainer中的navigation实际上是成功的navigation事件,但是frame没有上报任何内容,页面代码没有执行,也没有设计。
有什么建议吗?谢谢
编辑:
页面本身没有问题,因为我手动加载它们,它们确实有效。此外,这里是完整代码的 link:https://github.com/FaithLV/lotus
我导航到该页面的方式存在问题。
事实证明,URI 中的 "application" 不是上下文敏感的,实际上是按原样使用的。
正确的导航方式如下:
Navigate(new Uri($"pack://application:,,,/Views/UserPages/{Page}.xaml"), UriKind.Absolute);
我正在尝试创建一种加载页面的模块化方式,每个页面在主 window header 中都有自己的导航菜单项和一个单独的框架,以便始终将它们加载到内存中(以及播放精美的动画等)
这是包含已加载页面的 class。
public sealed class PageContainer : Frame
{
public string Title;
public PageContainer(string Page, bool CustomUri = false)
{
Visibility = System.Windows.Visibility.Collapsed;
NavigationUIVisibility = NavigationUIVisibility.Hidden;
Title = Page;
if(!CustomUri)
{
Navigate($"pack://lotus:,,,/Views/UserPages/{Page}.xaml", UriKind.Relative);
}
else
{
//todo
}
Console.WriteLine($"Navigation Item created {Title} with ?CustomUri: {CustomUri}");
}
public bool Visible
{
get => Visibility == System.Windows.Visibility.Visible;
set => Visibility = value ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
}
}
下面是我如何创建 PageContainer
Animations.PageTransitionAnimations AnimationLibrary;
public double _SlideAnimationLenght = 250;
public MainWindow()
{
InitializeComponent();
//Initialize Animation Library
AnimationLibrary = new Animations.PageTransitionAnimations(this);
InitializePage("Library");
InitializePage("Preferences");
InitializePage("Plugins");
InitializePage("Information");
foreach(PageContainer pp in LoadedContainers)
{
pp.Visible = true;
pp.BeginAnimation(MarginProperty, AnimationLibrary.ToLeft);
}
}
//Load a page and add it to navigation bar, if NoHeader, then don't add it to navigation
private void InitializePage(string page, bool noHeader = false)
{
if(!noHeader)
{
//Add page to navigation bar and set style
NavigationHeader.Children.Add(new NavigationItem(page)
{
Style = FindResource("HeaderMenu") as System.Windows.Style
});
}
//Add Page to PageContainer and Initialize it
PageContainer _page = new PageContainer(page);
_containers.Add(_page);
PagesContainer.Children.Add(_page);
}
//Public LoadedContainers, no setter
private List<PageContainer> _containers = new List<PageContainer>();
public List<PageContainer> LoadedContainers => _containers;
发生的情况是PageContainer中的navigation实际上是成功的navigation事件,但是frame没有上报任何内容,页面代码没有执行,也没有设计。
有什么建议吗?谢谢
编辑:
页面本身没有问题,因为我手动加载它们,它们确实有效。此外,这里是完整代码的 link:https://github.com/FaithLV/lotus
我导航到该页面的方式存在问题。 事实证明,URI 中的 "application" 不是上下文敏感的,实际上是按原样使用的。
正确的导航方式如下:
Navigate(new Uri($"pack://application:,,,/Views/UserPages/{Page}.xaml"), UriKind.Absolute);