diff --git a/AIDevGallery/MainWindow.xaml.cs b/AIDevGallery/MainWindow.xaml.cs index d913160b..c5d43337 100644 --- a/AIDevGallery/MainWindow.xaml.cs +++ b/AIDevGallery/MainWindow.xaml.cs @@ -132,9 +132,23 @@ public void NavigateToPage(object? obj) { NavigateToApiOrModelPage(modelTypes[0]); } - else if (obj is ModelDetails) - { - Navigate("Models", obj); + else if (obj is ModelDetails modelDetails) + { + // ModelDetails only contains an Id, not a direct ModelType reference. + // We need to look up the ModelType to determine if this should route to: + // - APISelectionPage (for WCRAPIs and children) + // - ModelSelectionPage (for all other models) + // This enables intelligent routing from search results and external navigation. + var modelTypeList = App.FindSampleItemById(modelDetails.Id); + if (modelTypeList.Count > 0) + { + NavigateToApiOrModelPage(modelTypeList[0]); + } + else + { + // Fallback: If ID lookup fails (e.g., user-added models), default to Models page + Navigate("Models", obj); + } } else if (obj is SampleNavigationArgs) { @@ -198,8 +212,36 @@ private void Navigate(Type page, object? param = null) if (page == typeof(APISelectionPage) && NavFrame.Content is APISelectionPage apiPage && param != null) { - // No need to navigate to the APISelectionPage again, we just want to navigate to the right subpage - apiPage.SetSelectedApiInMenu((ModelType)param); + // Optimize: Avoid re-navigating if already on APISelectionPage + // Just update the selected item in the navigation menu + if (param is ModelType modelType) + { + apiPage.SetSelectedApiInMenu(modelType); + } + else + { + // ModelDetails needs full navigation as APISelectionPage.OnNavigatedTo handles the lookup + // Unknown parameter type - perform full navigation to be safe + NavFrame.Navigate(page, param); + } + } + else if (page == typeof(ModelSelectionPage) && NavFrame.Content is ModelSelectionPage modelPage && param != null) + { + // Optimize: Avoid re-navigating if already on ModelSelectionPage + // Use the same pattern as APISelectionPage + if (param is ModelType modelType) + { + modelPage.SetSelectedModelInMenu(modelType); + } + else if (param is List modelTypes && modelTypes.Count > 0) + { + modelPage.SetSelectedModelInMenu(modelTypes[0]); + } + else + { + // For other parameter types (ModelDetails, string, MRU), perform full navigation + NavFrame.Navigate(page, param); + } } else if (page == typeof(ScenarioSelectionPage) && NavFrame.Content is ScenarioSelectionPage scenarioPage && param != null) { @@ -258,7 +300,7 @@ public void Navigate(SearchResult result) } else if (result.Tag is ModelType modelType) { - Navigate("models", modelType); + NavigateToApiOrModelPage(modelType); } } diff --git a/AIDevGallery/Pages/APIs/APIOverview.xaml.cs b/AIDevGallery/Pages/APIs/APIOverview.xaml.cs index 4c170089..37b29b82 100644 --- a/AIDevGallery/Pages/APIs/APIOverview.xaml.cs +++ b/AIDevGallery/Pages/APIs/APIOverview.xaml.cs @@ -45,7 +45,7 @@ private void APIViewer_ItemInvoked(ItemsView sender, ItemsViewItemInvokedEventAr { if (apiDefinition == api) { - App.MainWindow.Navigate("apis", item); + App.MainWindow.NavigateToPage(item); } } } diff --git a/AIDevGallery/Pages/Models/ModelSelectionPage.xaml.cs b/AIDevGallery/Pages/Models/ModelSelectionPage.xaml.cs index f3015aa7..757add49 100644 --- a/AIDevGallery/Pages/Models/ModelSelectionPage.xaml.cs +++ b/AIDevGallery/Pages/Models/ModelSelectionPage.xaml.cs @@ -273,6 +273,19 @@ private void NavView_SelectionChanged(NavigationView sender, NavigationViewSelec } } + /// + /// Public method to update the selected model in the navigation menu without re-navigating. + /// This mirrors the behavior of APISelectionPage.SetSelectedApiInMenu for consistency. + /// + public void SetSelectedModelInMenu(ModelType selectedType) + { + var modelTypes = new List { selectedType }; + foreach (NavigationViewItem item in NavView.MenuItems) + { + SetSelectedSampleInMenu(item, modelTypes, null); + } + } + private void SetSelectedSampleInMenu(NavigationViewItem item, List? selectedSample = null, ModelDetails? details = null) { if (selectedSample == null && details == null)