在wpf中登录成功之后怎么设置主页布局及点击不同的菜单跳转到不同的页面,这个是我们做wpf项目必要会的一个功能

通过frame与page实现在mvvm下的页面跳转

在wpf中登录成功之后怎么设置主页布局及点击不同的菜单跳转到不同的页面_哔哩哔哩_bilibili

1、MainWindow代码
复制代码
 <DockPanel>
     <StackPanel DockPanel.Dock="Top" Height="40">
         <Grid>
             <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="1.5*"></ColumnDefinition>
                 <ColumnDefinition Width="0.5*"></ColumnDefinition>
                 <ColumnDefinition Width="0.5*"></ColumnDefinition>
             </Grid.ColumnDefinitions>
             <TextBlock Text="AGV调度管理系统" FontSize="25" Grid.Column="0" ></TextBlock>
             <TextBlock Text="欢迎您:" FontSize="20" Grid.Column="1"  HorizontalAlignment="Right"></TextBlock>
             <TextBlock Text="{Binding  UserName, Mode=OneWay}" FontSize="20" Grid.Column="2" HorizontalAlignment="Left" Foreground="Red" ></TextBlock>
         </Grid>
        
     </StackPanel>
     <Border
   Width="100"
   Margin="0,0,10,0"
   Panel.ZIndex="1"
   Background="#2f3336"
   BorderBrush="#1d2125"
   BorderThickness="3"
   DockPanel.Dock="Left">
         <StackPanel Margin="0,0,10,0" Orientation="Vertical">
             <Border BorderBrush="#3c5254" BorderThickness="3">
                 <Button
               Margin="0,2"
               HorizontalAlignment="Stretch"
               Background="#2f3336"
               Command="{Binding HomeCmd}"
               Content="主页"
               Cursor="Hand"
               Foreground="White" />
             </Border>
​
             <Border BorderBrush="#3c5254" BorderThickness="3">
                 <Button
               Margin="0,3"
               HorizontalAlignment="Stretch"
               Background="#2f3366"
               Command="{Binding NavView}"
               CommandParameter="task"
               Content="任务"
               Cursor="Hand"
               Foreground="White" />
             </Border>
​
             <Border BorderBrush="#3c5254" BorderThickness="3">
                 <Button
               Margin="0,3"
               HorizontalAlignment="Stretch"
               Background="#2f3366"
               Command="{Binding NavView}"
               CommandParameter="queue"
               Content="队列"
               Cursor="Hand"
               Foreground="White" />
             </Border>
         </StackPanel>
     </Border>
     <Grid>
         <Frame Name="MainFrame" NavigationUIVisibility="Hidden" Grid.Row="1"/>
     </Grid>
 </DockPanel>
2、创建一个TaskPage的页。

a、首先在项目下创建一个Pages的文件夹。

b、添加一个页文件,命名为TaskPage.html

c、选择添加页。

在这个页面上添加三个页面,我们后面会在项目中用到

3、在ViewModels下的MainWindowViewModel中添加如下代码,为每个页面定义导航命令。

复制代码
​
    public class MainWindowViewModel : INotifyPropertyChanged
    {
        private Frame _frame;
        public event PropertyChangedEventHandler PropertyChanged;
​
        public MainWindowViewModel(Frame frame) {
        _frame = frame;
           
        }
        /// <summary>
        /// 跳转到TaskPage
        /// </summary>
        private ICommand _navigateToTaskPageCommand;
​
        public ICommand NavigateToTaskPageCommand
        {
            get
            {
                return _navigateToTaskPageCommand ?? new RelayCommand(param => NavigateToTaskPage());
            }
        }
        /// <summary>
        /// 跳转到QueuePage
        /// </summary>
        private ICommand _navigateToQueuePageCommand;
​
        public ICommand NavigateToQueuePageCommand
        {
            get
            {
                return _navigateToQueuePageCommand ?? new RelayCommand(param => NavigateToQueuePage());
            }
        }
​
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
​
        private void NavigateToTaskPage()
        {
            _frame.Navigate(new Uri("Pages/TaskPage.xaml",UriKind.Relative));
        }
​
        private void NavigateToQueuePage()
        {
            _frame.Navigate(new Uri("Pages/QueuePage.xaml", UriKind.Relative));
        }
​
​
​
        /// <summary>
        /// 登录之后用户名
        /// </summary>
        public string? UserName
        {
            get
            {
                return UserInfoService.USER_NAME;
            }
​
        }
    }
}

4、在MainWindows文件的Cs文件里修改代码如下:

复制代码
​
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
           
            InitializeComponent();
            DataContext = new MainWindowViewModel(this.MainFrame);
            this.Loaded += MainWindow_Loaded;
           
​
        }
​
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            MainFrame.Navigate(new Uri("Pages/MainPage.xaml", UriKind.Relative));
        }
    }
一个小作业

!IMPORTANT

如果有很多窗体,也要一个一个这样写吗?可以使用参数来处理。大家可以自己写一下。

相关推荐
ChaITSimpleLove1 小时前
.NET 10 的 AI 技术栈全景:M.E.AI、MCP 与 Agent Framework 深度解析
人工智能·.net·ai agent·mcp·agent framework·m.e.ai·hosted agents
sukalot2 小时前
windows 驱动实例分析系列: libusb驱动分析-应用层源码篇(三)
windows·驱动开发
格林威4 小时前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
J总裁的小芒果5 小时前
参数过多-分批传参
c#
sxd20015 小时前
Vmware和multicast
linux·windows·vmware·无线桥接·multicast
典典分享指南6 小时前
短视频分镜提示词:让 AI 出片的产品口播
java·c#·bash·composer·symfony
Z5998178417 小时前
c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
笔记·学习·c#
执子星海7 小时前
Registry Win32 API详解
c++·windows·microsoft·visualstudio·微软
defrag2577 小时前
Win9x下用Win32程序调用Win16函数
windows
me8328 小时前
【Tool】Windows 计划任务 + VBScript 弹窗提醒:从零到一的完整指南
windows