/// <summary> /// Constructs a new view model for a virtual macro board. /// </summary> /// <param name="keyLayout"></param> public VirtualBoardViewModel(IKeyPositionCollection keyLayout) { Keys = keyLayout ?? throw new ArgumentNullException(nameof(keyLayout)); KeyImages = new KeyImageCollection(Keys.Count); dispatcher = Dispatcher.CurrentDispatcher; }
/// <summary> /// Spawns a new virtual macro board with a given <paramref name="keyLayout"/>. /// </summary> /// <param name="keyLayout"></param> /// <returns></returns> public static IMacroBoard SpawnVirtualBoard(IKeyPositionCollection keyLayout) { VirtualBoardViewModel boardViewModel = null; VirtualBoardWindow boardWindow = null; Exception exceptionWasThrown = null; using (var waitForBoardWindow = new ManualResetEvent(false)) { var uiThread = new Thread(() => { try { boardViewModel = new VirtualBoardViewModel(keyLayout); boardWindow = new VirtualBoardWindow(boardViewModel); } catch (Exception ex) { exceptionWasThrown = ex; return; } finally { waitForBoardWindow.Set(); } boardWindow.Show(); Dispatcher.Run(); }) { IsBackground = true }; uiThread.SetApartmentState(ApartmentState.STA); uiThread.Start(); waitForBoardWindow.WaitOne(); if (exceptionWasThrown != null) { throw exceptionWasThrown; } return(boardViewModel); } }
public VirtualBoardLayout(IKeyPositionCollection keys, double width, double height) { var scaleX = width / keys.Area.Width; var scaleY = height / keys.Area.Height; var scale = Math.Min(scaleX, scaleY); var offsetX = (width - keys.Area.Width * scale) / 2; var offsetY = (height - keys.Area.Height * scale) / 2; KeyPositions = new List <Rect>(); for (var i = 0; i < keys.Count; i++) { KeyPositions.Add(new Rect( offsetX + keys[i].Left * scale, offsetY + keys[i].Top * scale, keys[i].Width * scale, keys[i].Height * scale )); } }