菜单与工具条

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>效果:
