WPF的导航功能有哪几种比较常用的方式?

jiancong chen 40 信誉分
2024-07-22T03:28:52.27+00:00

关于Windows Presentation Foundation的自定义导航栏开发导航功能问题

Windows Presentation Foundation
Windows Presentation Foundation
.NET Framework 的一部分,它提供统一的编程模型,用于在 Windows 上构建业务线桌面应用程序。
128 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hui Liu-MSFT 48,571 信誉分 Microsoft 供应商
    2024-07-22T09:11:48.87+00:00

    在WPF(Windows Presentation Foundation)中,有几种常用的导航方式。

    NavigationWindow 和 Page:

    • 使用 NavigationWindow 作为主窗口,包含多个 Page 页面。
    • 适用于需要在不同页面之间进行切换的应用程序。
    • 提供内置的导航历史记录(前进、后退功能)。

    Frame 和 Page:

    • 使用 Frame 控件来承载 Page 页面。
    • 适用于需要在应用程序的特定区域进行导航的场景。

    ContentControl 和 UserControl:

    • 使用 ContentControl 结合 UserControl 实现导航。
    • 适用于需要更细粒度控制的场景。

    下面是一个简单的示例。

    MainWindow.xaml:

    <Window x:Class="WpfApp4.MainWindow"
    
         ...
            xmlns:local="clr-namespace:WpfApp4"
    
            mc:Ignorable="d"
    
            Title="MainWindow" Height="450" Width="800">
    
        <Window.DataContext>
    
            <local:NavigationViewModel  />
    
        </Window.DataContext>
    
        <Grid>
    
            <Grid.ColumnDefinitions>
    
                <ColumnDefinition/>
    
                <ColumnDefinition/>
    
                <ColumnDefinition/>
    
                <ColumnDefinition/>
    
            </Grid.ColumnDefinitions>
    
            <Frame Name="MainFrame" Source="HomePage.xaml" />
    
            <Button Grid.Column="1" Content="navigate window" Height="40" Click="Button_Click"/>
    
            
    
            <ContentControl  Grid.Column="2" Name="MainContentControl" />
    
            <StackPanel Orientation="Horizontal" Grid.Column="3">
    
                <Button Content="Home" Height="40"  Command="{Binding NavigateCommand}" CommandParameter="Home"/>
    
                <Button Content="Next" Height="40"  Command="{Binding NavigateCommand}" CommandParameter="Next"/>
    
            </StackPanel>
    
            <Frame  Grid.Column="3" Content="{Binding CurrentPage}" />
    
        </Grid>
    
    </Window>
    
    
    

    MainWindow.xaml.cs:

     public partial class MainWindow : Window
     {
         public MainWindow()
         {
             InitializeComponent();
             NavigateToNextPage();
             ShowNextUserControl();
    
         }
         private void NavigateToNextPage()
         {
             MainFrame.Navigate(new Uri("NextPage.xaml", UriKind.Relative));
         }
         private void ShowNextUserControl()
         {
             MainContentControl.Content = new NextUserControl();
         }
    
         private void Button_Click(object sender, RoutedEventArgs e)
         {
             NavigationWindow navigationWindow = new NavigationWindow();
             navigationWindow.Source = new Uri("Page1.xaml", UriKind.Relative);
             navigationWindow.Show();
    
         }
     }
     public class NavigationViewModel : INotifyPropertyChanged
     {
         private ICommand _navigateCommand;
         private Page _currentPage;
    
         public Page CurrentPage
         {
             get { return _currentPage; }
             set
             {
                 _currentPage = value;
                 OnPropertyChanged("CurrentPage");
             }
         }
    
         public ICommand NavigateCommand
         {
             get
             {
                 if (_navigateCommand == null)
                 {
                     _navigateCommand = new RelayCommand<string>(Navigate);
                 }
                 return _navigateCommand;
             }
         }
    
         private void Navigate(string pageName)
         {
             switch (pageName)
             {
                 case "Home":
                     CurrentPage = new HomePage();
                     break;
                 case "Next":
                     CurrentPage = new NextPage();
                     break;
             }
         }
      
    
         public event PropertyChangedEventHandler PropertyChanged;
    
         protected void OnPropertyChanged(string name)
         {
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
         }
     }
    
     public class RelayCommand<T> : ICommand
     {
         private readonly Action<T> _execute;
         private readonly Func<T, bool> _canExecute;
    
         public RelayCommand(Action<T> execute, Func<T, bool> canExecute = null)
         {
             _execute = execute;
             _canExecute = canExecute;
         }
    
         public bool CanExecute(object parameter)
         {
             return _canExecute == null || _canExecute((T)parameter);
         }
    
         public void Execute(object parameter)
         {
             _execute((T)parameter);
         }
    
         public event EventHandler CanExecuteChanged
         {
             add { CommandManager.RequerySuggested += value; }
             remove { CommandManager.RequerySuggested -= value; }
         }
     }
    

    Page1:

    <StackPanel>
        <TextBlock Text="Page1" />
        <Button Content="Go to Next Page" Click="GoToNextPage_Click"/>
    </StackPanel>
    
    
    // Page1.xaml.cs:
    
     public partial class Page1 : Page
     {
         public Page1()
         {
             InitializeComponent();
         }
         private void GoToNextPage_Click(object sender, RoutedEventArgs e)
         {
             this.NavigationService.Navigate(new Uri("NextPage.xaml", UriKind.Relative));
         }
    
     }
    

    HomePage:

     <StackPanel>
         <TextBlock Text="HomePage" />
         <Button Content="Go to Next Page" Click="GoToNextPage_Click"/>
     </StackPanel>
    
    // HomePage .xaml.cs:
    
      public partial class HomePage : Page
      {
          public HomePage()
          {
              InitializeComponent();
          }
          private void GoToNextPage_Click(object sender, RoutedEventArgs e)
          {
              this.NavigationService.Navigate(new Uri("NextPage.xaml", UriKind.Relative));
          }
      }
    
    

    Nextpage:

    <Grid>
        <TextBlock Text="nextpage" />
    </Grid>
    

    NextUserControl:

      <Grid>
          <TextBlock Text="NextUserControl" />
      </Grid>
    
    
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    1 个人认为此答案很有帮助。

1 个其他答案

排序依据: 非常有帮助
  1. Deleted

    由于违反了我们的《行为准则》,此答案已被删除。 在采取措施之前,已通过自动检测手动报告或识别该答案。 有关详细信息,请参阅我们的行为准则


    已关闭批注。 了解详细信息

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。