WPF Menu控件 我也有个不能点菜的菜单

WPF Menu控件 我也有个不能点菜的菜单

 

Windows 应用程序最常见的部分之一是菜单,有时也称为主菜单,因为应用程序中通常只有一个。菜单很实用,因为它提供了很多选项,只占用很少的空间。

向其中添加菜单项非常简单 - 您只需向其中添加 MenuItem 元素,并且每个 MenuItem 可以具有一系列子项目,从而允许您创建分层菜单,正如您在许多 Windows 应用程序中所知道的那样。

做一个菜单吧

<Window x:Class="WpfApp11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp11"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Menu   VerticalAlignment="Top">
            <MenuItem Header="文件" >
                <MenuItem Header="打开" />
                <MenuItem Header="保存" />
                <MenuItem Header="关闭" />
            </MenuItem>
        </Menu>
    </Grid>
</Window>

与大多数 Windows 应用程序一样,菜单放置在窗口的顶部,但为了与 WPF 的巨大灵活性保持一致,您实际上可以将 Menu 控件放置在您喜欢的任何位置,以及您可能需要的任何宽度或高度。

上面定义了一个顶级项目,有 3个子项目。使用Header属性来定义项目的显示标签。

现在,这个菜单还没有实现功能代码。想要添加代码,可以给menuitem菜单条目添加click属性,

    <Grid>
        <Menu   VerticalAlignment="Top">
            <MenuItem Header="文件" >
                <MenuItem Header="打开"  Click="openfile"/>
                <MenuItem Header="保存" />
                <MenuItem Header="关闭" />
            </MenuItem>
        </Menu>
    </Grid>

  

然后在CS文件中添加实现代码

        private void openfile(object sender, RoutedEventArgs e)
        {
            // 使用OpenFileDialog控件打开对话框选择文件

            // 现在先弹出个提示看看效果

            MessageBox.Show("执行打开文件流程");
        }

  

按F5运行以下。

其他菜单也一样,只有添加了事件代码才有反应,不添加事件代码点了没反应。

 

——————————————————————————

做个例子吧。

实现记事本的打开文件和保存文件功能

先做界面

<Window x:Class="WpfApp11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp11"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <!--
        Grid、StackPanel、DockPanel这三个控件都属于布局容器控件
        Grid:网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。近似于Table。
        StackPanel:栈式面板。可将包含的元素在竖直或水平方向上排成一条直线,当移除一个元素后,
            后面的元素会自动向前移动以填充空缺。
        DockPanel:泊靠式面板。内部元素可以选择泊靠方向。就像码头一样,船可以停靠在边缘。
        -->
        <DockPanel>
            <!--DockPanel.Dock属于依赖属性-->
            <Menu DockPanel.Dock="Top">
                <!-- 一级菜单 -->
                <MenuItem Header="文件">
                    <!-- 二级菜单 -->
                    <MenuItem Header="打开" >
                        <!--三级菜单-->
                        <MenuItem Header="打开模板" />
                        <MenuItem Header="打开文件" Click="openfile" />
                        <MenuItem Header="最近打开的文件" />
                    </MenuItem>

                    <MenuItem Header="保存" Click="savefile" />
                    <!--菜单中的分割线-->
                    <Separator />
                    <MenuItem Header="关闭" />
                </MenuItem>

                <MenuItem Header="编辑" >
                    <MenuItem Header="复制" />
                    <MenuItem Header="粘贴" />
                </MenuItem>
            </Menu>

            <!--添加一个文本框,设置了自动换行和接受回车键允许多行,
            让这个程序看起来像个记事本-->
            <TextBox x:Name="textbox"
                     TextWrapping="Wrap" 
                     AcceptsReturn="True"
                     />
        </DockPanel>
    </Grid>
</Window>

  

编辑代码

using Microsoft.Win32;
using System.IO;
using System.Windows;

namespace WpfApp11
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void openfile(object sender, RoutedEventArgs e)
        {
            // 打开文件对话框,选择文件
            OpenFileDialog openfiledialog = new OpenFileDialog();
            
            //如果打开成功
            if (openfiledialog.ShowDialog() == true)
            {
                // 获取文件路径
                string filepath = openfiledialog.FileName;
                
                // MessageBox.Show(filepath);

                // 读取文件内容,将文本框的text属性值设置为文件内容
                textbox.Text = new StreamReader(filepath).ReadToEnd();

            }
        }

        private void savefile(object sender, RoutedEventArgs e)
        {
            // 打开保存文件对话框,选择文件
            SaveFileDialog savefiledialog = new SaveFileDialog();
            if (savefiledialog.ShowDialog() == true)
            {
                string filepath = savefiledialog.FileName;
                // MessageBox.Show(filepath);

                // 如果文本文件被打开,直接覆盖会提示错误
                // 毕竟这是最简单的功能,没做那么多预测设置
                File.WriteAllText(filepath, textbox.Text);

            }

        }
    }
}

  

按F5试一下。

 

posted @ 2024-11-07 20:28  Surfnet  阅读(32)  评论(0编辑  收藏  举报