# 交互规范 本文档详细说明组件交互设计规范,包括交互状态、动画过渡、反馈机制和拖拽调整。 ## 🎯 交互设计原则 - **即时反馈** - 所有操作都应有立即的视觉反馈 - **清晰可预测** - 用户能预期操作的结果 - **流畅自然** - 动画和过渡平滑流畅 - **符合直觉** - 遵循用户的使用习惯 - **宽容错误** - 允许撤销和恢复 ## 🖱️ 交互状态 ### 标准交互状态 所有可交互元素都应该有以下状态: | 状态 | 说明 | 视觉表现 | |-----|------|---------| | **正常(Normal)** | 默认状态 | 标准样式 | | **悬停(Hover)** | 鼠标悬停 | 背景变化、光标变化 | | **按下(Pressed)** | 鼠标按下 | 背景更暗、轻微缩放 | | **聚焦(Focused)** | 键盘聚焦 | 显示聚焦环 | | **禁用(Disabled)** | 不可用 | 降低透明度、灰色显示 | | **选中(Selected)** | 被选中 | 强调色背景 | ### 按钮状态 #### 主要按钮(Primary Button) ```xml ``` #### 次要按钮(Secondary Button) ```xml ``` #### 图标按钮 ```xml ``` ### 输入框状态 ```xml ``` ### 光标样式 ```xml 拖动我 调整大小 ``` ## 🎬 动画与过渡 ### 动画时长标准 | 类型 | 时长 | 使用场景 | |-----|------|---------| | **微交互** | 100-150ms | 悬停、点击 | | **短动画** | 200-300ms | 展开、收起 | | **中动画** | 300-500ms | 页面切换、弹出 | | **长动画** | 500-800ms | 复杂过渡 | ### 缓动函数(Easing) | 函数 | 效果 | 使用场景 | |-----|------|---------| | **Linear** | 线性 | 加载动画、循环动画 | | **CubicEaseOut** | 快进慢出 | 大部分交互动画 | | **CubicEaseIn** | 慢进快出 | 元素退出 | | **CubicEaseInOut** | 慢进慢出 | 平滑过渡 | | **BackEaseOut** | 回弹效果 | 强调动画 | | **ElasticEaseOut** | 弹性效果 | 有趣的交互 | ### 悬停动画 ```xml ``` ### 点击动画 ```xml ``` ### 展开/收起动画 ```xml ``` ### 淡入/淡出动画 ```xml ``` ### 旋转动画(加载中) ```xml ``` ### 脉冲动画(加载中) ```xml ``` ## 💬 反馈机制 ### 加载状态 #### 加载指示器 ```xml ``` #### 骨架屏 ```xml ``` ### 错误状态 ```xml ``` ## 🖐️ 拖拽与调整 ### 拖拽组件 组件应支持拖拽移动: ```csharp public class DraggableComponent : ComponentBase { private Point _dragStartPoint; private bool _isDragging; protected override void OnPointerPressed(PointerPressedEventArgs e) { _dragStartPoint = e.GetPosition(this); _isDragging = true; Cursor = new Cursor(StandardCursorType.SizeAll); } protected override void OnPointerMoved(PointerEventArgs e) { if (_isDragging) { var currentPosition = e.GetPosition(this.Parent as Visual); var offset = currentPosition - _dragStartPoint; // 更新位置 Canvas.SetLeft(this, Canvas.GetLeft(this) + offset.X); Canvas.SetTop(this, Canvas.GetTop(this) + offset.Y); } } protected override void OnPointerReleased(PointerReleasedEventArgs e) { _isDragging = false; Cursor = new Cursor(StandardCursorType.Arrow); // 保存位置 SavePosition(); } } ``` ### 调整大小 组件应支持调整尺寸: ```xml ``` ```csharp private void OnResizeHandlePressed(object sender, PointerPressedEventArgs e) { _isResizing = true; _resizeStartPoint = e.GetPosition(this.Parent as Visual); _initialWidth = Width; _initialHeight = Height; } private void OnResizeHandleMoved(object sender, PointerEventArgs e) { if (_isResizing) { var currentPoint = e.GetPosition(this.Parent as Visual); var delta = currentPoint - _resizeStartPoint; Width = Math.Max(MinWidth, _initialWidth + delta.X); Height = Math.Max(MinHeight, _initialHeight + delta.Y); } } private void OnResizeHandleReleased(object sender, PointerReleasedEventArgs e) { _isResizing = false; SaveSize(); } ``` ### 拖拽反馈 ```xml ``` ## ⌨️ 键盘交互 ### 快捷键 常用快捷键: | 快捷键 | 操作 | |-------|------| | **Enter** | 确认、提交 | | **Esc** | 取消、关闭 | | **Tab** | 焦点切换 | | **Space** | 激活按钮 | | **方向键** | 导航、选择 | | **Ctrl+S** | 保存 | | **Ctrl+Z** | 撤销 | | **Ctrl+Y** | 重做 | ### 实现快捷键 ```csharp protected override void OnKeyDown(KeyEventArgs e) { switch (e.Key) { case Key.Enter: ConfirmAction(); e.Handled = true; break; case Key.Escape: CancelAction(); e.Handled = true; break; case Key.S when e.KeyModifiers.HasFlag(KeyModifiers.Control): SaveAction(); e.Handled = true; break; } base.OnKeyDown(e); } ``` ### 焦点管理 ```xml private void OnLoaded(object sender, RoutedEventArgs e) { UsernameBox.Focus(); }