Skip to content

Commit

Permalink
New Template Project for WindowsAppSdk.
Browse files Browse the repository at this point in the history
  • Loading branch information
sharpninja committed Jul 24, 2022
1 parent 3ed034f commit 8ae4895
Show file tree
Hide file tree
Showing 90 changed files with 3,196 additions and 392 deletions.
202 changes: 202 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
# Rules in this file were initially inferred by Visual Studio IntelliCode from the Template Studio codebase.
# You can modify the rules from these initially generated values to suit your own policies.
# You can learn more about editorconfig here: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference.

[*.cs]

#Core editorconfig formatting - indentation

#use soft tabs (spaces) for indentation
indent_style = space

#Formatting - new line options

#place else statements on a new line
csharp_new_line_before_else = true
#require braces to be on a new line for lambdas, methods, control_blocks, types, properties, and accessors (also known as "Allman" style)
csharp_new_line_before_open_brace = all

#Formatting - organize using options

#sort System.* using directives alphabetically, and place them before other usings
dotnet_sort_system_directives_first = true

#Formatting - spacing options

#require NO space between a cast and the value
csharp_space_after_cast = false
#require a space before the colon for bases or interfaces in a type declaration
csharp_space_after_colon_in_inheritance_clause = true
#require a space after a keyword in a control flow statement such as a for loop
csharp_space_after_keywords_in_control_flow_statements = true
#require a space before the colon for bases or interfaces in a type declaration
csharp_space_before_colon_in_inheritance_clause = true
#remove space within empty argument list parentheses
csharp_space_between_method_call_empty_parameter_list_parentheses = false
#remove space between method call name and opening parenthesis
csharp_space_between_method_call_name_and_opening_parenthesis = false
#do not place space characters after the opening parenthesis and before the closing parenthesis of a method call
csharp_space_between_method_call_parameter_list_parentheses = false
#remove space within empty parameter list parentheses for a method declaration
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
#place a space character after the opening parenthesis and before the closing parenthesis of a method declaration parameter list.
csharp_space_between_method_declaration_parameter_list_parentheses = false

#Formatting - wrapping options

#leave code block on separate lines
csharp_preserve_single_line_blocks = false

#Style - Code block preferences

#prefer curly braces even for one line of code
csharp_prefer_braces = true:suggestion

#Style - expression bodied member options

#prefer expression bodies for accessors
csharp_style_expression_bodied_accessors = true:warning
#prefer block bodies for constructors
csharp_style_expression_bodied_constructors = false:suggestion
#prefer expression bodies for methods
csharp_style_expression_bodied_methods = when_on_single_line:silent
#prefer expression-bodied members for properties
csharp_style_expression_bodied_properties = true:warning

#Style - expression level options

#prefer out variables to be declared before the method call
csharp_style_inlined_variable_declaration = false:suggestion
#prefer the language keyword for member access expressions, instead of the type name, for types that have a keyword to represent them
dotnet_style_predefined_type_for_member_access = true:suggestion

#Style - Expression-level preferences

#prefer default over default(T)
csharp_prefer_simple_default_expression = true:suggestion
#prefer objects to be initialized using object initializers when possible
dotnet_style_object_initializer = true:suggestion

#Style - implicit and explicit types

#prefer var over explicit type in all cases, unless overridden by another code style rule
csharp_style_var_elsewhere = true:suggestion
#prefer var is used to declare variables with built-in system types such as int
csharp_style_var_for_built_in_types = true:suggestion
#prefer var when the type is already mentioned on the right-hand side of a declaration expression
csharp_style_var_when_type_is_apparent = true:suggestion

#Style - language keyword and framework type options

#prefer the language keyword for local variables, method parameters, and class members, instead of the type name, for types that have a keyword to represent them
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion

#Style - Language rules
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
csharp_style_var_for_built_in_types = true:warning

#Style - modifier options

#prefer accessibility modifiers to be declared except for public interface members. This will currently not differ from always and will act as future proofing for if C# adds default interface methods.
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion

#Style - Modifier preferences

#when this rule is set to a list of modifiers, prefer the specified ordering.
csharp_preferred_modifier_order = public,private,protected,internal,static,async,readonly,override,sealed,abstract,virtual:warning
dotnet_style_readonly_field = true:warning

#Style - Pattern matching

#prefer pattern matching instead of is expression with type casts
csharp_style_pattern_matching_over_as_with_null_check = true:warning

#Style - qualification options

#prefer events not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_event = false:suggestion
#prefer fields not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_field = false:suggestion
#prefer methods not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_method = false:suggestion
#prefer properties not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_property = false:suggestion
csharp_indent_labels = one_less_than_current
csharp_using_directive_placement = outside_namespace:silent
csharp_prefer_simple_using_statement = true:warning
csharp_style_namespace_declarations = file_scoped:warning
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent

[*.{cs,vb}]
dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
indent_size = 4
end_of_line = crlf
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
[*.{cs,vb}]

#Style - Unnecessary code rules
csharp_style_unused_value_assignment_preference = discard_variable:warning

#### Naming styles ####

# Naming rules

dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case

dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case

# Symbol specifications

dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =

dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =

dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =

# Naming styles

dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_compound_assignment = true:warning
dotnet_style_prefer_simplified_interpolation = true:suggestion
16 changes: 16 additions & 0 deletions .vsconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"version": "1.0",
"components": [
"Microsoft.Component.MSBuild",
"Microsoft.NetCore.Component.Runtime.6.0",
"Microsoft.NetCore.Component.SDK",
"Microsoft.VisualStudio.Component.ManagedDesktop.Core",
"Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites",
"Microsoft.VisualStudio.Component.NuGet",
"Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Component.Windows10SDK",
"Microsoft.VisualStudio.ComponentGroup.MSIX.Packaging",
"Microsoft.VisualStudio.ComponentGroup.WindowsAppSDK.Cs",
"Microsoft.VisualStudio.Workload.ManagedDesktop"
]
}
76 changes: 62 additions & 14 deletions WindowsAppSdkHost.sln
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,86 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Extensions
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "templates", "templates", "{59093D20-3B21-11EC-BDE7-AF52EAA7DCFD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HostedWindowsAppSdk", "templates\HostedWindowsAppSdk\HostedWindowsAppSdk.csproj", "{2A3F2AE1-302E-4BB0-9B5F-6B4F9B20CBF7}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CompleteWithInstaller", "templates\CompleteWithInstaller\CompleteWithInstaller.csproj", "{8183D194-CF46-48F8-A054-5F09E2DA69B8}"
EndProject
Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "HostedWindowsAppSdk.Installer", "templates\HostedWindowsAppSdk.Installer\HostedWindowsAppSdk.Installer.wapproj", "{AFC3E846-1DE5-409C-ACB5-A0C0281DA011}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CompleteWithInstaller.Core", "templates\CompleteWithInstaller.Core\CompleteWithInstaller.Core.csproj", "{C272842D-E647-45A9-AB72-A96623C84B6B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|Any CPU.ActiveCfg = Debug|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|Any CPU.Build.0 = Debug|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|ARM64.ActiveCfg = Debug|ARM64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|ARM64.Build.0 = Debug|ARM64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|x64.ActiveCfg = Debug|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|x64.Build.0 = Debug|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|x86.ActiveCfg = Debug|x86
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Debug|x86.Build.0 = Debug|x86
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|Any CPU.ActiveCfg = Release|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|Any CPU.Build.0 = Release|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|ARM64.ActiveCfg = Release|ARM64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|ARM64.Build.0 = Release|ARM64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|x64.ActiveCfg = Release|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|x64.Build.0 = Release|x64
{2A3F2AE1-302E-4BB0-9B5F-6B4F9B20CBF7}.Debug|x64.ActiveCfg = Debug|x64
{2A3F2AE1-302E-4BB0-9B5F-6B4F9B20CBF7}.Debug|x64.Build.0 = Debug|x64
{2A3F2AE1-302E-4BB0-9B5F-6B4F9B20CBF7}.Release|x64.ActiveCfg = Release|x64
{2A3F2AE1-302E-4BB0-9B5F-6B4F9B20CBF7}.Release|x64.Build.0 = Release|x64
{AFC3E846-1DE5-409C-ACB5-A0C0281DA011}.Debug|x64.ActiveCfg = Debug|x64
{AFC3E846-1DE5-409C-ACB5-A0C0281DA011}.Debug|x64.Build.0 = Debug|x64
{AFC3E846-1DE5-409C-ACB5-A0C0281DA011}.Debug|x64.Deploy.0 = Debug|x64
{AFC3E846-1DE5-409C-ACB5-A0C0281DA011}.Release|x64.ActiveCfg = Release|x64
{AFC3E846-1DE5-409C-ACB5-A0C0281DA011}.Release|x64.Build.0 = Release|x64
{AFC3E846-1DE5-409C-ACB5-A0C0281DA011}.Release|x64.Deploy.0 = Release|x64
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|x86.ActiveCfg = Release|x86
{624647A5-F444-43BE-82CD-3C38ECA17BD9}.Release|x86.Build.0 = Release|x86
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|Any CPU.ActiveCfg = Debug|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|Any CPU.Build.0 = Debug|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|Any CPU.Deploy.0 = Debug|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|ARM64.ActiveCfg = Debug|arm64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|ARM64.Build.0 = Debug|arm64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|ARM64.Deploy.0 = Debug|arm64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|x64.ActiveCfg = Debug|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|x64.Build.0 = Debug|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|x64.Deploy.0 = Debug|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|x86.ActiveCfg = Debug|x86
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|x86.Build.0 = Debug|x86
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Debug|x86.Deploy.0 = Debug|x86
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|Any CPU.ActiveCfg = Release|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|Any CPU.Build.0 = Release|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|Any CPU.Deploy.0 = Release|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|ARM64.ActiveCfg = Release|arm64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|ARM64.Build.0 = Release|arm64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|ARM64.Deploy.0 = Release|arm64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|x64.ActiveCfg = Release|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|x64.Build.0 = Release|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|x64.Deploy.0 = Release|x64
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|x86.ActiveCfg = Release|x86
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|x86.Build.0 = Release|x86
{8183D194-CF46-48F8-A054-5F09E2DA69B8}.Release|x86.Deploy.0 = Release|x86
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|Any CPU.ActiveCfg = Debug|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|Any CPU.Build.0 = Debug|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|ARM64.ActiveCfg = Debug|arm64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|ARM64.Build.0 = Debug|arm64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|x64.ActiveCfg = Debug|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|x64.Build.0 = Debug|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|x86.ActiveCfg = Debug|x86
{C272842D-E647-45A9-AB72-A96623C84B6B}.Debug|x86.Build.0 = Debug|x86
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|Any CPU.ActiveCfg = Release|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|Any CPU.Build.0 = Release|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|ARM64.ActiveCfg = Release|arm64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|ARM64.Build.0 = Release|arm64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|x64.ActiveCfg = Release|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|x64.Build.0 = Release|x64
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|x86.ActiveCfg = Release|x86
{C272842D-E647-45A9-AB72-A96623C84B6B}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{624647A5-F444-43BE-82CD-3C38ECA17BD9} = {866D1621-C2C8-4F68-A928-D6EE9D25E335}
{2A3F2AE1-302E-4BB0-9B5F-6B4F9B20CBF7} = {59093D20-3B21-11EC-BDE7-AF52EAA7DCFD}
{AFC3E846-1DE5-409C-ACB5-A0C0281DA011} = {59093D20-3B21-11EC-BDE7-AF52EAA7DCFD}
{8183D194-CF46-48F8-A054-5F09E2DA69B8} = {59093D20-3B21-11EC-BDE7-AF52EAA7DCFD}
{C272842D-E647-45A9-AB72-A96623C84B6B} = {59093D20-3B21-11EC-BDE7-AF52EAA7DCFD}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EDC7A06A-AD43-4918-B9B9-5836FEE0AE33}
Expand Down
76 changes: 76 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Windows App SDK Host

Allows hosting a Windows App SDK Application in an `IHost` that manages the lifecycle of the hosted Application.

[![Packages](https://github.com/sharpninja/WindowsAppSdkHost/actions/workflows/packages.yml/badge.svg)](https://github.com/sharpninja/WindowsAppSdkHost/actions/workflows/packages.yml)

## Usage

__(Convert existing project or the default template's output)__

1. Add `<DefineConstants>DISABLE_XAML_GENERATED_MAIN</DefineConstants>` in the main `PropertyGroup` of your applications project file.
2. Add reference to `CommunityToolkit.Extensions.Hosting.WindowsAppSdk`
3. Add `Program.cs` to the root of your application project.
4. Add this code to the `Program.cs`:

```csharp
public static class Program
{
[STAThread]
public static void Main(string[] args)
{
var builder = new WindowsAppSdkHostBuilder<App>();

builder.ConfigureServices(
(_, collection) =>
{
// If your main Window is named differently, change it here.
collection.AddSingleton<MainWindow>();
}
);

var app = builder.Build();

app.StartAsync().GetAwaiter().GetResult();
}
}
```

5. Set your `Program.cs` as the startup object by adding `<StartupObject>HostedWindowsAppSdk.Program</StartupObject>` to your project file.
6. Use the `CancelableApplication` as the base class of your application by modifying your `App.xaml`:

```xml
<host:CancelableApplication
x:Class="HostedWindowsAppSdk.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:host="using:CommunityToolkit.Extensions.Hosting"
xmlns:local="using:HostedWindowsAppSdk">
<Application.Resources>
</Application.Resources>
</host:CancelableApplication>
```

7. Update your App.xaml.cs to use dependency injection.

```csharp
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
// Get window from Dependency Injection.
_mWindow = Services.GetRequiredService<MainWindow>();


_mWindow.Activate();
}
```

## Notes

The `WindowsAppSdkHost` uses several features of the Microsoft.Extensions ecosystem:

1. Includes all configuration resources defined for the `DefaultHostBuilder`.
2. Registers the required `CancellableApplication` with dependency injection.
3. Manages the lifecycle of the Application in the `StartAsync` method of the `WindowsAppSdkHost`.
4. Write unhandled errors to default `ILogger`. The `Ilogger` can be obtained from the static `Services` property of the `CancellableApplication` after building the app.

If there are other patterns you feel should be available or required then start a discussion.
Loading

0 comments on commit 8ae4895

Please sign in to comment.