少有人走的路

勇哥的工业自动化技术网站

Avalonia学习(十二)菜单与工具条

菜单与工具条

image.png


MainWindowViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

namespace _12_MenuToolbar.ViewModels;

public partial class MainWindowViewModel : ObservableObject
{
    [ObservableProperty]
    private string _statusMessage = "就绪";

    [ObservableProperty]
    private string _currentFile = "未保存";

    [ObservableProperty]
    private bool _isBold;

    [ObservableProperty]
    private bool _isItalic;

    [ObservableProperty]
    private bool _isUnderline;

    [RelayCommand]
    private void NewFile()
    {
        CurrentFile = "未命名.txt";
        StatusMessage = "新建文件";
    }

    [RelayCommand]
    private void OpenFile()
    {
        StatusMessage = "打开文件对话框";
    }

    [RelayCommand]
    private void SaveFile()
    {
        StatusMessage = $"保存文件: {CurrentFile}";
    }

    [RelayCommand]
    private void Exit()
    {
        StatusMessage = "退出应用程序";
    }

    [RelayCommand]
    private void Undo()
    {
        StatusMessage = "撤销";
    }

    [RelayCommand]
    private void Redo()
    {
        StatusMessage = "重做";
    }

    [RelayCommand]
    private void Cut()
    {
        StatusMessage = "剪切";
    }

    [RelayCommand]
    private void Copy()
    {
        StatusMessage = "复制";
    }

    [RelayCommand]
    private void Paste()
    {
        StatusMessage = "粘贴";
    }

    [RelayCommand]
    private void About()
    {
        StatusMessage = "关于 - 菜单和工具栏演示 v1.0";
    }
}



App.axaml

<Application xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="_12_MenuToolbar.App">
    <!-- 应用样式 -->
    <Application.Styles>
        <FluentTheme  /> <!-- Light=亮色 / Dark=暗色 -->
    </Application.Styles>

    <!-- 启动窗口配置 -->
    <Application.Styles>
    </Application.Styles>
</Application>


MainWindow.axaml

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:_12_MenuToolbar.ViewModels"
        x:Class="_12_MenuToolbar.MainWindow"
        Title="Menu and Toolbar - 菜单和工具栏演示"
        Width="600"
        Height="500"
        x:DataType="vm:MainWindowViewModel">

  <Window.DataContext>
    <vm:MainWindowViewModel/>
  </Window.DataContext>

  <DockPanel> 
    <!-- 顶部菜单 -->
    <Menu DockPanel.Dock="Top">
      <MenuItem Header="_文件">
        <MenuItem Header="_新建" Command="{Binding NewFileCommand}" InputGesture="Ctrl+N">
          <MenuItem.Icon>
            <PathIcon Data="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
        <MenuItem Header="_打开" Command="{Binding OpenFileCommand}" InputGesture="Ctrl+O">
          <MenuItem.Icon>
            <PathIcon Data="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
        <MenuItem Header="_保存" Command="{Binding SaveFileCommand}" InputGesture="Ctrl+S">
          <MenuItem.Icon>
            <PathIcon Data="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
        <Separator/>
        <MenuItem Header="退出(_X)" Command="{Binding ExitCommand}" InputGesture="Alt+F4"/>
      </MenuItem>

      <MenuItem Header="_编辑">
        <MenuItem Header="_撤销" Command="{Binding UndoCommand}" InputGesture="Ctrl+Z">
          <MenuItem.Icon>
            <PathIcon Data="M12.5,8C9.85,8 7.45,9 5.6,10.6L2,7V16H11L7.38,12.38C8.77,11.22 10.54,10.5 12.5,10.5C16.04,10.5 19.05,12.81 20.1,16L22.47,15.22C21.08,11.03 17.15,8 12.5,8Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
        <MenuItem Header="_重做" Command="{Binding RedoCommand}" InputGesture="Ctrl+Y">
          <MenuItem.Icon>
            <PathIcon Data="M18.4,10.6C16.55,9 14.15,8 11.5,8C6.85,8 2.92,11.03 1.54,15.22L3.9,16C4.95,12.81 7.95,10.5 11.5,10.5C13.45,10.5 15.23,11.22 16.62,12.38L13,16H22V7L18.4,10.6Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
        <Separator/>
        <MenuItem Header="剪切(_T)" Command="{Binding CutCommand}" InputGesture="Ctrl+X">
          <MenuItem.Icon>
            <PathIcon Data="M9,9V4.5L18.5,12L9,19.5V15H6V9M6,2L12,8L6,14V11H4V7H6V2Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
        <MenuItem Header="_复制" Command="{Binding CopyCommand}" InputGesture="Ctrl+C">
          <MenuItem.Icon>
            <PathIcon Data="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
        <MenuItem Header="_粘贴" Command="{Binding PasteCommand}" InputGesture="Ctrl+V">
          <MenuItem.Icon>
            <PathIcon Data="M19,20H5V4H7V7H17V4H19M12,2A1,1 0 0,1 13,3A1,1 0 0,1 12,4A1,1 0 0,1 11,3A1,1 0 0,1 12,2M19,2H14.82C14.4,0.84 13.3,0 12,0C10.7,0 9.6,0.84 9.18,2H5A2,2 0 0,0 3,4V20A2,2 0 0,0 5,22H19A2,2 0 0,0 21,20V4A2,2 0 0,0 19,2Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
      </MenuItem>

      <MenuItem Header="_格式"> 
        <!-- 用标准 MenuItem + IsCheckable 实现可勾选,无需额外命名空间 -->
        <MenuItem Header="_加粗"   IsChecked="{Binding IsBold}"/>
        <MenuItem Header="_斜体"   IsChecked="{Binding IsItalic}"/>
        <MenuItem Header="_下划线"   IsChecked="{Binding IsUnderline}"/>
      </MenuItem>

      <MenuItem Header="_帮助">
        <MenuItem Header="_关于" Command="{Binding AboutCommand}">
          <MenuItem.Icon>
            <PathIcon Data="M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z" Width="16" Height="16"/>
          </MenuItem.Icon>
        </MenuItem>
      </MenuItem>
    </Menu>
        
<!-- 替换原来的 <ToolBar ...> ... </ToolBar> 为这个 -->
<DockPanel DockPanel.Dock="Top" 
           Background="#F5F5F5" 
          
           MinHeight="36">
    
    <Button Command="{Binding NewFileCommand}" ToolTip.Tip="新建 (Ctrl+N)" Margin="2">
        <PathIcon Data="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z" Width="18" Height="18"/>
    </Button>
    
    <Button Command="{Binding OpenFileCommand}" ToolTip.Tip="打开 (Ctrl+O)" Margin="2">
        <PathIcon Data="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" Width="18" Height="18"/>
    </Button>
    
    <Button Command="{Binding SaveFileCommand}" ToolTip.Tip="保存 (Ctrl+S)" Margin="2">
        <PathIcon Data="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z" Width="18" Height="18"/>
    </Button>

    <!-- 分隔线 -->
    <Border Width="1" Margin="4,2" Background="#D0D0D0"/>

    <Button Command="{Binding UndoCommand}" ToolTip.Tip="撤销 (Ctrl+Z)" Margin="2">
        <PathIcon Data="M12.5,8C9.85,8 7.45,9 5.6,10.6L2,7V16H11L7.38,12.38C8.77,11.22 10.54,10.5 12.5,10.5C16.04,10.5 19.05,12.81 20.1,16L22.47,15.22C21.08,11.03 17.15,8 12.5,8Z" Width="18" Height="18"/>
    </Button>
    
    <Button Command="{Binding RedoCommand}" ToolTip.Tip="重做 (Ctrl+Y)" Margin="2">
        <PathIcon Data="M18.4,10.6C16.55,9 14.15,8 11.5,8C6.85,8 2.92,11.03 1.54,15.22L3.9,16C4.95,12.81 7.95,10.5 11.5,10.5C13.45,10.5 15.23,11.22 16.62,12.38L13,16H22V7L18.4,10.6Z" Width="18" Height="18"/>
    </Button>

    <!-- 分隔线 -->
    <Border Width="1" Margin="4,2" Background="#D0D0D0"/>

    <ToggleButton IsChecked="{Binding IsBold}" ToolTip.Tip="加粗" Margin="2" Width="30">
        <TextBlock Text="B" FontWeight="Bold"/>
    </ToggleButton>
    
    <ToggleButton IsChecked="{Binding IsItalic}" ToolTip.Tip="斜体" Margin="2" Width="30">
        <TextBlock Text="I" FontStyle="Italic"/>
    </ToggleButton>
    
    <ToggleButton IsChecked="{Binding IsUnderline}" ToolTip.Tip="下划线" Margin="2" Width="30">
        <TextBlock Text="U" TextDecorations="Underline"/>
    </ToggleButton>
</DockPanel>
       
    <!-- 状态栏(用 DockPanel 实现,无兼容性问题) -->
    <DockPanel DockPanel.Dock="Bottom" Height="28" Background="#F0F0F0"  >
      <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Text="{Binding StatusMessage}"/>
      <TextBlock DockPanel.Dock="Right" VerticalAlignment="Center" Text="{Binding CurrentFile, StringFormat='文件: {0}'}"/>
    </DockPanel>

    <!-- 主内容区 -->
    <Grid Margin="20">
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
      </Grid.RowDefinitions>

      <Border Grid.Row="0" Background="#F5F5F5" Padding="15" CornerRadius="8" Margin="0,0,0,20">
        <StackPanel Spacing="10">
          <TextBlock Text="菜单和工具栏演示" FontSize="18" FontWeight="Bold"/>
          <TextBlock Text="尝试点击菜单项或工具栏按钮,下方的状态栏会显示操作信息"
                     TextWrapping="Wrap"/>
        </StackPanel>
      </Border>

      <Border Grid.Row="1" Background="White" Padding="15" BorderBrush="#E0E0E0" BorderThickness="1" CornerRadius="8">
        <StackPanel Spacing="15">
          <TextBlock Text="文本编辑区域" FontWeight="Bold"/>
          <TextBox AcceptsReturn="True"
                   TextWrapping="Wrap"
                   Height="150"
                   Watermark="在这里输入文本..."/>
          <StackPanel Orientation="Horizontal" Spacing="10">
            <CheckBox IsChecked="{Binding IsBold}" Content="加粗"/>
            <CheckBox IsChecked="{Binding IsItalic}" Content="斜体"/>
            <CheckBox IsChecked="{Binding IsUnderline}" Content="下划线"/>
          </StackPanel>
        </StackPanel>
      </Border>
    </Grid>
  </DockPanel>
</Window>



效果:

act11.gif



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2026年3月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864