具备界面基础功能

This commit is contained in:
2026-01-01 22:40:32 +08:00
parent 0c86b4dad3
commit d039559402
81 changed files with 8333 additions and 1905 deletions

View File

@@ -0,0 +1,81 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace SHH.CameraDashboard;
public static class TouchBehavior
{
//原有 Action 属性保持不变...
public static readonly DependencyProperty ActionProperty =
DependencyProperty.RegisterAttached("Action", typeof(PtzAction?), typeof(TouchBehavior), new PropertyMetadata(null, OnActionChanged));
public static PtzAction? GetAction(DependencyObject obj) => (PtzAction?)obj.GetValue(ActionProperty);
public static void SetAction(DependencyObject obj, PtzAction? value) => obj.SetValue(ActionProperty, value);
// ★★★ [新增] 私有附加属性,用于记录“是否处于按下状态” ★★★
private static readonly DependencyProperty IsActiveProperty =
DependencyProperty.RegisterAttached("IsActive", typeof(bool), typeof(TouchBehavior), new PropertyMetadata(false));
private static bool GetIsActive(DependencyObject obj) => (bool)obj.GetValue(IsActiveProperty);
private static void SetIsActive(DependencyObject obj, bool value) => obj.SetValue(IsActiveProperty, value);
private static void OnActionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is Button btn)
{
btn.PreviewMouseDown -= Btn_PreviewMouseDown;
btn.PreviewMouseUp -= Btn_PreviewMouseUp;
btn.MouseLeave -= Btn_PreviewMouseUp;
if (e.NewValue != null)
{
btn.PreviewMouseDown += Btn_PreviewMouseDown;
btn.PreviewMouseUp += Btn_PreviewMouseUp;
btn.MouseLeave += Btn_PreviewMouseUp;
}
}
}
private static void Btn_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (sender is Button btn && btn.DataContext is CameraPtzViewModel vm)
{
var action = GetAction(btn);
if (action.HasValue && vm.StartCommand.CanExecute(action.Value))
{
// 1. 标记为活跃状态
SetIsActive(btn, true);
// 2. 执行开始命令
vm.StartCommand.Execute(action.Value);
// (可选) 捕获鼠标,防止快速拖出窗口丢失 MouseUp
btn.CaptureMouse();
}
}
}
private static void Btn_PreviewMouseUp(object sender, MouseEventArgs e)
{
if (sender is Button btn && btn.DataContext is CameraPtzViewModel vm)
{
// ★★★ [核心修改] 只有之前标记为活跃,才执行停止 ★★★
if (GetIsActive(btn))
{
var action = GetAction(btn);
if (action.HasValue && vm.StopCommand.CanExecute(action.Value))
{
vm.StopCommand.Execute(action.Value);
}
// 重置状态
SetIsActive(btn, false);
// 释放鼠标
btn.ReleaseMouseCapture();
}
}
}
}