From 5bdca1d2e108c35a62291664327ec683e560ba29 Mon Sep 17 00:00:00 2001 From: Roxk Date: Sat, 20 Apr 2024 16:34:45 +0800 Subject: [PATCH] doc: Update README for sample app support #15 --- README.md | 87 +++++++++++++++++++++++++++++++++---------- vs-property-page.png | Bin 0 -> 13845 bytes 2 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 vs-property-page.png diff --git a/README.md b/README.md index cb3a7ce..c0bc557 100644 --- a/README.md +++ b/README.md @@ -10,20 +10,30 @@ WinUI3 Xaml Preview allows you to see a a live preview of your UI while authorin Contributions are welcome! :D -## Features +## Feature - Interactive preview of your XAML code (powered by `XamlReader`) - Integration with VS2022 17.9+ - Reload via opening/saving/switching - Supports your own user control and custom control - Supports controls in dependency (i.e. libraries) +- Supports control template previewing with control+style dropdown +- Supports DLL project (directly, or with a separate Sample App project) -Custom control's template previewing is not supported yet but is planned. Stay tuned. +## Feature/Language Support Table +||C++|C#| +|--|--|--| +| App | ✔️ | ✔️ | +| App packaged with WAP project | ✔️ | ✔️ | +| Dynamic WinRT Component (via separate Sample App project\*) | ✔️ | ✔️ | +| Static WinRT Component (via separate Sample App project\*) | ✔️ | ✔️ | +|Dynamic WinRT Component (Direct\*) | ✔️ | ❌ (blocked by cswinrt)| +|Static WinRT Component (Direct\*) | ❌ | ❌ | -## Language/Feature Support Table -|| App | WinRT Component (Dynamic) | WinRT Component (Static) | -|--|--|--|--| -|C++|✔️|✔️|❌| -|C#|✔️|❌ (blocked by cswinrt)|❌| +\*See section below on Direct vs Sample App + +### WinRT Component Support - Direct Mode and Sample App Mode + +WinRT Component preview support comes in two mode. One is "Direct" mode, another is "Sample App" mode. Direct mode means you can preview directly in-project. Sample App mode means you preview via a separate "Sample App" project. ## Limitation - Require building the project once before use @@ -31,9 +41,13 @@ Custom control's template previewing is not supported yet but is planned. Stay t - App project require a few lines of setup - WinRT component project require some setup for any nuget/external dependencies -### WinRT Component Limitation +### WinRT Component Direct Mode's Limitation + +The previewer tries its best to resolve your WinRT component's dynamic _project_, or _internal_ dependency and load them before use. This feature is known as Auto DLL Loading. Auto DLL Loading only works for project references whose output is a dynamic library. -The previewer tries its best to resolve your WinRT component's dynamic _project_ dependency and load them before use. This feature is known as Auto DLL Loading. Auto DLL Loading only works for project references whose output is a dynamic library. If your WinRT component has any _external_ dynamic dependencies, e.g. nuget/external dll dependencies (transitive or direct), you'd need to copy them to your dll's output folder so the system can pick them up. +If your WinRT component has any _external_ dynamic dependencies, e.g. nuget/external dll dependencies (transitive or direct), you'd need to copy them to your dll's output folder so the system can pick them up. + +If your library has a complex dependency graph, it is suggested that you switch to Sample App mode. ### Non-Goal @@ -41,9 +55,11 @@ The author does not believe in Designer so this project would stay only as a liv ## Getting Started +### App Project + 1. Install the [VS extension](https://marketplace.visualstudio.com/items?itemName=Roxk.winui3xamlpreview). Require VS2022 17.9+ -2. On _each of your WinUI 3 project_ that uses this feature, install the nuget +2. On your _WinUI 3 App project_ that uses this feature, install the nuget ``` nuget install WinUI3XamlPreview @@ -51,10 +67,6 @@ nuget install WinUI3XamlPreview 3. If you are using C++, add ` @@ -104,18 +114,46 @@ Note that the next steps for app project and WinRT component project are differe Make sure to replace `$YourTargetName` with your build output name. E.g. if your build output is `MyApp.exe`, the correction execution alias to add is `MyApp-WinUI3XP.exe`. -### WinRT Component Project +6. Viola! You have finished the setup for app project + +### WinRT Component Project (Direct Mode) + +1. Install the [VS extension](https://marketplace.visualstudio.com/items?itemName=Roxk.winui3xamlpreview). Require VS2022 17.9+ + +2. On your _WinUI 3 WinRT Component project_ that uses this feature, install the nuget + +``` +nuget install WinUI3XamlPreview +``` + +3. If you are using C++, add `$SampleAppProjectName` property. Make sure you replace `$SampleAppProjectName` with the name of the sample app project. E.g. if your WinRT Component's project name is `Lib`, your sample app (test app)'s project name is `LibTest`, the correct property value is `LibTest`. If you do not want to edit project file directly, you can (1) install the nuget on your _WinUI 3 WinRT Component project_, (2) edit the property by right clicking the component project in Visual Studio -> Properties -> WinUI3XamlPreview tab -> edit Launch Project. Make sure you disable the preview to save compile time. See [Configuration](#Configuration) section for more details + +5. Viola! You have finished the setup for WinRT Component proejct Sample App mode. ## Usage 1. After setup, build your project again. -2. For packaged app, deploy your app once by righting click on the project -> deploy. +2. For packaged app, deploy your app once by righting click on the project -> deploy. If you are using WinRT Component Sample App mode, make sure you build/deploy your sample app project instead of just the component project. 3. Locate the "Toggle WinUI 3 Xaml Preview" in the "Extensions" menu at the top. 4. Open any xaml file and click the toggle to launch preview, click it again to stop. You can also close the preview window to turn off live preview. @@ -124,6 +162,17 @@ The preview renders according to the following triggers: - Switching to a XAML file in the editor - Saving a XAML file +## Configuration + +![WinUI3XamlPreview's property page in Visual Studio](vs-property-page.png) + +You can configure the behavior of WinUI3XamlPreview via a dedicated property page in Visual Studio. If you are comfortable editing project file directly, you can also insert/modify properties listed below. + +|MSBuild Property|type|Behavior| +|--|--|--| +|`WinUI3XPEnabled`|`Bool`|`true` to enable WinUI3XamlPreview, `false` to disable. Default is true. When it's disabled, no winmd/dll are added to the project. Useful for CI/CD| +|`WinUI3XPLaunchProject`|`String`|Default is null. If specified, instead of using the XAML file's project to locate the preview app, use the specified project instead| + ## Technical Details TODO diff --git a/vs-property-page.png b/vs-property-page.png new file mode 100644 index 0000000000000000000000000000000000000000..7634c5926db088371155024e62164f7b86bd423a GIT binary patch literal 13845 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 literal 0 HcmV?d00001