From ceee72736311754b4dcaa7b0496e7a886cb9059d Mon Sep 17 00:00:00 2001 From: Chloepeg Date: Wed, 3 Dec 2025 14:59:49 +0000 Subject: [PATCH 1/3] Fix port context menu when switching windows Adds event handlers to close the port context menu when the Dynamo/Revit window loses focus, preventing it from floating above other windows. No changes to existing in-canvas behaviour. --- .../Views/Core/WorkspaceView.xaml.cs | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs index f1efcd7074c..ab7d9cedf0b 100644 --- a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs @@ -108,6 +108,9 @@ public WorkspaceView() InitializeComponent(); + Loaded += WorkspaceView_Loaded; + Unloaded += WorkspaceView_Unloaded; + DataContextChanged += OnWorkspaceViewDataContextChanged; // view of items to drag @@ -906,8 +909,8 @@ private void OnCanvasMouseDown(object sender, MouseButtonEventArgs e) InCanvasSearchBar.IsOpen = false; if (GeoScalingPopup != null) GeoScalingPopup.IsOpen = false; - - if(PortContextMenu.IsOpen) DestroyPortContextMenu(); + + if (PortContextMenu.IsOpen) DestroyPortContextMenu(); if (!ViewModel.IsConnecting && !ViewModel.IsPanning && e.MiddleButton == MouseButtonState.Pressed) { @@ -915,11 +918,38 @@ private void OnCanvasMouseDown(object sender, MouseButtonEventArgs e) } } + private void WorkspaceView_Loaded(object sender, RoutedEventArgs e) + { + var ownerWindow = Window.GetWindow(this); + if (ownerWindow != null) + { + ownerWindow.Deactivated += OwnerWindow_Deactivated; + } + } + + private void WorkspaceView_Unloaded(object sender, RoutedEventArgs e) + { + var ownerWindow = Window.GetWindow(this); + if (ownerWindow != null) + { + ownerWindow.Deactivated -= OwnerWindow_Deactivated; + } + } + + /// + /// When the Dynamo/Revit window loses focus, close the port context menu + /// so it doesn't float above other windows. + /// + private void OwnerWindow_Deactivated(object sender, EventArgs e) + { + DestroyPortContextMenu(); + } + /// /// Closes the port's context menu and sets its references to null. /// private void DestroyPortContextMenu() => PortContextMenu.IsOpen = false; - + private void OnMouseRelease(object sender, MouseButtonEventArgs e) { if (e == null) return; // in certain bizarre cases, e can be null From 26285a7ae4e5794ba6b15842465418eb86565597 Mon Sep 17 00:00:00 2001 From: Deyan Nenov Date: Mon, 8 Dec 2025 16:34:13 +0000 Subject: [PATCH 2/3] unsubscribe from new event handlers - make sure we are unsubscribing using the Dispose pattern --- src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs index ab7d9cedf0b..032a59af9a9 100644 --- a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs @@ -1291,6 +1291,10 @@ private void OnGeometryScaling_Click(object sender, RoutedEventArgs e) public void Dispose() { RemoveViewModelsubscriptions(ViewModel); + + Loaded -= WorkspaceView_Loaded; + Unloaded -= WorkspaceView_Unloaded; + DataContextChanged -= OnWorkspaceViewDataContextChanged; } } From 31ab8f2eede1559e58378cb2faff25c91947735c Mon Sep 17 00:00:00 2001 From: Chloepeg Date: Wed, 10 Dec 2025 19:18:49 +0000 Subject: [PATCH 3/3] Ensure port context menu closes on window deactivation Added logic to destroy the port context menu when the window is deactivated or the WorkspaceView loses focus. This ensures context menus do not remain open even when switching tab inside Dynamo --- src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs | 4 ++++ src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs b/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs index 0970d83f004..02ee15bca2d 100644 --- a/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs @@ -1589,7 +1589,11 @@ private void HidePopupWhenWindowDeactivated(object obj) { var workspace = this.ChildOfType(); if (workspace != null) + { workspace.HideAllPopUp(obj); + workspace.DestroyPortContextMenu(); + } + } private void TrackStartupAnalytics() diff --git a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs index 032a59af9a9..f1c0116be4d 100644 --- a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs @@ -111,6 +111,8 @@ public WorkspaceView() Loaded += WorkspaceView_Loaded; Unloaded += WorkspaceView_Unloaded; + LostFocus += WorkspaceView_LostFocus; + DataContextChanged += OnWorkspaceViewDataContextChanged; // view of items to drag @@ -122,6 +124,11 @@ public WorkspaceView() dictionaries.Add(SharedDictionaryManager.DataTemplatesDictionary); } + private void WorkspaceView_LostFocus(object sender, RoutedEventArgs e) + { + DestroyPortContextMenu(); + } + void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) @@ -948,7 +955,7 @@ private void OwnerWindow_Deactivated(object sender, EventArgs e) /// /// Closes the port's context menu and sets its references to null. /// - private void DestroyPortContextMenu() => PortContextMenu.IsOpen = false; + internal void DestroyPortContextMenu() => PortContextMenu.IsOpen = false; private void OnMouseRelease(object sender, MouseButtonEventArgs e) { @@ -1294,7 +1301,7 @@ public void Dispose() Loaded -= WorkspaceView_Loaded; Unloaded -= WorkspaceView_Unloaded; - + LostFocus -= WorkspaceView_LostFocus; DataContextChanged -= OnWorkspaceViewDataContextChanged; } }