/
kochkatech
/
Queue
Обзор
Документация
Войти
/
kochkatech
/
Queue
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
dev
src/Queue.Display/Views/BoardWindow.xaml.cs
94 строки
4 KB
kochkareal
feat: вкладка "Экраны" в Admin — запуск/управление табло и АРМ оператора
27 июл 2026, 21:26
27 июл 2026, 21:26
62e41f9
Код
Авторство
О чём код?
using System; using System.Windows; using System.Windows.Interop; using Key = System.Windows.Input.Key; // UseWindowsForms=true (нужен для Screen API ниже) добавляет неявную ссылку на // System.Windows.Forms, где тоже есть KeyEventArgs — уточняем явно. using KeyEventArgs = System.Windows.Input.KeyEventArgs; namespace Queue.Display.Views; public partial class BoardWindow : Window { // По умолчанию — киоск (как раньше): для самостоятельного запуска на выделенном ТВ/мониторе // ничего не должно измениться. Оконный режим — только когда табло запускает Queue.Admin // (вкладка "Экраны"), чтобы администратор успел перетащить окно на нужный физический экран // до перевода в киоск (см. App.xaml.cs, разбор --windowed). private readonly bool _startWindowed; // Сообщает фактическую смену режима вовне (см. App.xaml.cs) — срабатывает при ЛЮБОЙ смене, // и по команде из Queue.Admin, и по Escape, чтобы список экранов в Admin не показывал // устаревшее состояние после того, как пользователь сам вышел из киоска на месте. public event Action<bool>? ModeChanged; public BoardWindow(bool startWindowed = false) { _startWindowed = startWindowed; InitializeComponent(); Loaded += (_, _) => { if (_startWindowed) { EnterWindowedMode(); } else { EnterKioskMode(); } }; } // Раньше выйти из табло можно было только Alt+F4 или диспетчером задач — при случайном // запуске на обычном рабочем ПК (не выделенном ТВ) это выглядело как зависшее приложение. // Escape работает всегда, независимо от того, как окно было запущено. private void BoardWindow_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) { EnterWindowedMode(); } } // Раньше вызывалась WindowState.Maximized, но в паре с WindowStyle="None" WPF растягивает // окно только на рабочую область экрана (за вычетом панели задач) — известная особенность, // из-за которой полоска экрана остаётся видна. Вместо Maximized растягиваем окно вручную на // весь физический экран. System.Windows.Forms.Screen.FromHandle берёт ТЕКУЩИЙ монитор (на // котором сейчас находится окно), а не всегда первичный — это важно, когда администратор // из Queue.Admin сначала перетащил окно на нужный монитор в оконном режиме и только потом // включил киоск. public void EnterKioskMode() { var handle = new WindowInteropHelper(this).Handle; var screen = System.Windows.Forms.Screen.FromHandle(handle); WindowStyle = WindowStyle.None; ResizeMode = ResizeMode.NoResize; Topmost = true; ShowInTaskbar = false; WindowState = WindowState.Normal; Left = screen.Bounds.Left; Top = screen.Bounds.Top; Width = screen.Bounds.Width; Height = screen.Bounds.Height; ModeChanged?.Invoke(true); } public void EnterWindowedMode() { WindowStyle = WindowStyle.SingleBorderWindow; ResizeMode = ResizeMode.CanResize; Topmost = false; ShowInTaskbar = true; WindowState = WindowState.Normal; Width = 1000; Height = 650; WindowStartupLocation = WindowStartupLocation.CenterScreen; Left = (SystemParameters.PrimaryScreenWidth - Width) / 2; Top = (SystemParameters.PrimaryScreenHeight - Height) / 2; ModeChanged?.Invoke(false); } }