Add vs info to settings (#14169)

* Initial commit to add a page to the OOBE experience for the Visual Studio integration with WSL. * Updated link for C++ to the landing page for Linux dev. * Reverting accidental commit of UserConfig.cmake.sample. * Revert accidental change * Revert "cleanup: fix UserConfig.cmake.sample in master branch (#14076)" This reverts commit 4b23185dfe53b250f9069976283353678702d95e. * Reapply "cleanup: fix UserConfig.cmake.sample in master branch (#14076)" This reverts commit d97e2753bb998533efc592925ba4fb58fa623a75. * revert * revert * Tidying whitespace * Tidying whitespace * Tidying whitespace * Tidying whitespace * Tidying whitespace * Update src/windows/wslsettings/Views/OOBE/ShellPage.xaml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/windows/wslsettings/Activation/ProtocolActivationHandler.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

Andy Sterland committed Mar 3, 2026 at 11:45 UTC 32329bb35c84320d3f48799efae7f71dcfa9b909
11 files changed +97
Images/SettingsOOBEVSIcon.png
Binary files /dev/null and b/Images/SettingsOOBEVSIcon.png differ
Images/SettingsOOBEVSIntegration.png
Binary files /dev/null and b/Images/SettingsOOBEVSIntegration.png differ
localization/strings/en-US/Resources.resw
+29
@@ -1873,4 +1873,33 @@ You can also access more VS Code Remote options through the command palette with
1873 <data name="Settings_VMIdleTimeoutTextBox.AutomationProperties.HelpText" xml:space="preserve">
1874 <value>The number of milliseconds that a VM is idle, before it is shut down.</value>
1875 </data>
1876 + <data name="Settings_OOBEVSIntegration.Title" xml:space="preserve">
1877 + <value>Build, run, debug, and profile your apps running on WSL from Visual Studio</value>
1878 + </data>
1879 + <data name="Settings_OOBEVSIntegration.Description" xml:space="preserve">
1880 + <value>Run and debug your apps on WSL from Visual Studio</value>
1881 + </data>
1882 + <data name="Settings_OOBEVSIntegration_VSForDotNetLink.Content" xml:space="preserve">
1883 + <value>Learn more about WSL in Visual Studio for .NET developers</value>
1884 + </data>
1885 + <data name="Settings_OOBEVSIntegration_VSForDotNetLink.NavigateUri" xml:space="preserve">
1886 + <value>https://learn.microsoft.com/visualstudio/debugger/debug-dotnet-core-in-wsl-2</value>
1887 + <comment>{locked}Uri should redirect to the correct locale for the browser</comment>
1888 + </data>
1889 + <data name="Settings_OOBEVSIntegration_VSForCppLink.Content" xml:space="preserve">
1890 + <value>Learn more about Visual Studio and WSL for C++ developers</value>
1891 + </data>
1892 + <data name="Settings_OOBEVSIntegration_VSForCppLink.NavigateUri" xml:space="preserve">
1893 + <value>https://learn.microsoft.com/cpp/linux/?view=msvc-170</value>
1894 + <comment>{locked}Uri should redirect to the correct locale for the browser</comment>
1895 + </data>
1896 + <data name="Settings_OOBEVSIntegration_Description.Text" xml:space="preserve">
1897 + <value>You can easily run and debug your .NET Core and cross platform C++ apps in Linux without leaving Visual Studio using Windows Subsystem for Linux (WSL). If you are a cross-platform developer, you can use this method as a simple way to test more of your target environments.</value>
1898 + </data>
1899 + <data name="Settings_OOBEVSIntegration_Title.Text" xml:space="preserve">
1900 + <value>Visual Studio Integration</value>
1901 + </data>
1902 + <data name="Settings_Shell_VSIntegration.Content" xml:space="preserve">
1903 + <value>Visual Studio Integration</value>
1904 + </data>
1905 </root>
src/windows/wslsettings/Activation/ProtocolActivationHandler.cs
+3
@@ -88,6 +88,9 @@ public class ProtocolActivationHandler : ActivationHandler<LaunchActivatedEventA
88 case "vscodeint":
89 pageKey = typeof(VSCodeIntegrationViewModel).FullName!;
90 break;
91 + case "vsint":
92 + pageKey = typeof(VSIntegrationViewModel).FullName!;
93 + break;
94 case "gpuaccel":
95 pageKey = typeof(GPUAccelerationViewModel).FullName!;
96 break;
src/windows/wslsettings/App.xaml.cs
+2
@@ -98,6 +98,8 @@ public partial class App : Application
98 services.AddTransient<NetworkingIntegrationPage>();
99 services.AddTransient<VSCodeIntegrationViewModel>();
100 services.AddTransient<VSCodeIntegrationPage>();
101 + services.AddTransient<VSIntegrationViewModel>();
102 + services.AddTransient<VSIntegrationPage>();
103 services.AddTransient<WorkingAcrossFileSystemsViewModel>();
104 services.AddTransient<WorkingAcrossFileSystemsPage>();
105 services.AddTransient<Views.OOBE.ShellPage>();
src/windows/wslsettings/CMakeLists.txt
+7
@@ -19,6 +19,7 @@ file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/wslbw.ico ${BIN}/${TargetApp}/Assets
19 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEDockerIcon.png ${BIN}/${TargetApp}/Assets/SettingsOOBEDockerIcon.png)
20 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEFileExplorerIcon.png ${BIN}/${TargetApp}/Assets/SettingsOOBEFileExplorerIcon.png)
21 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEVSCodeIcon.png ${BIN}/${TargetApp}/Assets/SettingsOOBEVSCodeIcon.png)
22 +file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEVSIcon.png ${BIN}/${TargetApp}/Assets/SettingsOOBEVSIcon.png)
23
24 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBECrossOSFileAccess.gif ${BIN}/${TargetApp}/Assets/SettingsOOBECrossOSFileAccess.gif)
25 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEDistroManagement.png ${BIN}/${TargetApp}/Assets/SettingsOOBEDistroManagement.png)
@@ -28,6 +29,7 @@ file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEGPUAcceleration.gif ${BI
29 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEGUIApps.png ${BIN}/${TargetApp}/Assets/SettingsOOBEGUIApps.png)
30 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBENetworkingIntegration.png ${BIN}/${TargetApp}/Assets/SettingsOOBENetworkingIntegration.png)
31 file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEVSCodeIntegration.png ${BIN}/${TargetApp}/Assets/SettingsOOBEVSCodeIntegration.png)
32 +file(CREATE_LINK ${CMAKE_SOURCE_DIR}/images/SettingsOOBEVSIntegration.png ${BIN}/${TargetApp}/Assets/SettingsOOBEVSIntegration.png)
33
34 file(GLOB STRINGS ${CMAKE_SOURCE_DIR}/localization/strings/**/*.resw)
35
@@ -83,6 +85,7 @@ add_executable(
85 ViewModels/OOBE/GUIAppsViewModel.cs
86 ViewModels/OOBE/NetworkingIntegrationViewModel.cs
87 ViewModels/OOBE/VSCodeIntegrationViewModel.cs
88 + ViewModels/OOBE/VSIntegrationViewModel.cs
89 ViewModels/OOBE/WorkingAcrossFileSystemsViewModel.cs
90 ViewModels/Settings/AboutViewModel.cs
91 ViewModels/Settings/DeveloperViewModel.cs
@@ -108,6 +111,8 @@ add_executable(
111 Views/OOBE/ShellPage.xaml.cs
112 Views/OOBE/VSCodeIntegrationPage.xaml
113 Views/OOBE/VSCodeIntegrationPage.xaml.cs
114 + Views/OOBE/VSIntegrationPage.xaml
115 + Views/OOBE/VSIntegrationPage.xaml.cs
116 Views/OOBE/WorkingAcrossFileSystemsPage.xaml
117 Views/OOBE/WorkingAcrossFileSystemsPage.xaml.cs
118 Views/Settings/AboutPage.xaml
@@ -158,6 +163,8 @@ csharp_set_xaml_cs_properties(
163 Views/OOBE/ShellPage.xaml.cs
164 Views/OOBE/VSCodeIntegrationPage.xaml
165 Views/OOBE/VSCodeIntegrationPage.xaml.cs
166 + Views/OOBE/VSIntegrationPage.xaml
167 + Views/OOBE/VSIntegrationPage.xaml.cs
168 Views/OOBE/WorkingAcrossFileSystemsPage.xaml
169 Views/OOBE/WorkingAcrossFileSystemsPage.xaml.cs
170 Views/Settings/AboutPage.xaml
src/windows/wslsettings/Services/PageService.cs
+1
@@ -26,6 +26,7 @@ public class PageService : IPageService
26 Configure<GeneralViewModel, GeneralPage>();
27 Configure<WorkingAcrossFileSystemsViewModel, WorkingAcrossFileSystemsPage>();
28 Configure<VSCodeIntegrationViewModel, VSCodeIntegrationPage>();
29 + Configure<VSIntegrationViewModel, VSIntegrationPage>();
30 Configure<GUIAppsViewModel, GUIAppsPage>();
31 Configure<GPUAccelerationViewModel, GPUAccelerationPage>();
32 Configure<DockerDesktopIntegrationViewModel, DockerDesktopIntegrationPage>();
src/windows/wslsettings/ViewModels/OOBE/VSIntegrationViewModel.cs new
+12
@@ -0,0 +1,12 @@
1 +// Copyright (C) Microsoft Corporation. All rights reserved.
2 +
3 +using CommunityToolkit.Mvvm.ComponentModel;
4 +
5 +namespace WslSettings.ViewModels.OOBE;
6 +
7 +public partial class VSIntegrationViewModel : ObservableRecipient
8 +{
9 + public VSIntegrationViewModel()
10 + {
11 + }
12 +}
src/windows/wslsettings/Views/OOBE/ShellPage.xaml
+5
@@ -112,6 +112,11 @@
112 <BitmapIcon ShowAsMonochrome="False" UriSource="/Assets/SettingsOOBEVSCodeIcon.png" />
113 </NavigationViewItem.Icon>
114 </NavigationViewItem>
115 + <NavigationViewItem x:Uid="Settings_Shell_VSIntegration" helpers:NavigationHelper.NavigateTo="WslSettings.ViewModels.OOBE.VSIntegrationViewModel">
116 + <NavigationViewItem.Icon>
117 + <BitmapIcon ShowAsMonochrome="False" UriSource="/Assets/SettingsOOBEVSIcon.png" />
118 + </NavigationViewItem.Icon>
119 + </NavigationViewItem>
120 </NavigationView.MenuItems>
121 <NavigationView.FooterMenuItems>
122 <!--
src/windows/wslsettings/Views/OOBE/VSIntegrationPage.xaml new
+19
@@ -0,0 +1,19 @@
1 +<Page
2 + x:Class="WslSettings.Views.OOBE.VSIntegrationPage"
3 + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 + xmlns:behaviors="using:WslSettings.Behaviors"
6 + xmlns:controls="using:WslSettings.Controls"
7 + behaviors:NavigationViewHeaderBehavior.HeaderMode="Never">
8 +
9 + <controls:OOBEContent x:Uid="Settings_OOBEVSIntegration" HeroImage="ms-appx:///Assets/SettingsOOBEVSIntegration.png">
10 + <controls:OOBEContent.PageContent>
11 + <StackPanel Orientation="Vertical" Spacing="12">
12 + <TextBlock x:Uid="Settings_OOBEVSIntegration_Title" Style="{StaticResource OobeSubtitleStyle}" Margin="0,0,0,-6"/>
13 + <TextBlock x:Uid="Settings_OOBEVSIntegration_Description" TextWrapping="Wrap"/>
14 + <HyperlinkButton x:Uid="Settings_OOBEVSIntegration_VSForDotNetLink" Margin="0,6,0,0" Style="{StaticResource TextButtonStyle}"/>
15 + <HyperlinkButton x:Uid="Settings_OOBEVSIntegration_VSForCppLink" Margin="0,6,0,0" Style="{StaticResource TextButtonStyle}"/>
16 + </StackPanel>
17 + </controls:OOBEContent.PageContent>
18 + </controls:OOBEContent>
19 +</Page>
src/windows/wslsettings/Views/OOBE/VSIntegrationPage.xaml.cs new
+19
@@ -0,0 +1,19 @@
1 +// Copyright (C) Microsoft Corporation. All rights reserved.
2 +
3 +using Microsoft.UI.Xaml.Controls;
4 +using WslSettings.ViewModels.OOBE;
5 +namespace WslSettings.Views.OOBE;
6 +
7 +public sealed partial class VSIntegrationPage : Page
8 +{
9 + public VSIntegrationViewModel ViewModel
10 + {
11 + get;
12 + }
13 +
14 + public VSIntegrationPage()
15 + {
16 + ViewModel = App.GetService<VSIntegrationViewModel>();
17 + InitializeComponent();
18 + }
19 +}