From e131779e2740eb6d43051242b04ab15a6fd22628 Mon Sep 17 00:00:00 2001 From: Damian Suess Date: Sat, 8 Mar 2025 15:04:10 -0500 Subject: [PATCH 1/2] Splash screen example with Shell window swapping --- Prism.Avalonia.sln | 7 + e2e/SampleSplashScreen/.editorconfig | 430 ++++++++++++++++++ e2e/SampleSplashScreen/App.axaml | 11 + e2e/SampleSplashScreen/App.axaml.cs | 156 +++++++ .../Assets/avalonia-logo.ico | Bin 0 -> 16958 bytes e2e/SampleSplashScreen/Program.cs | 21 + .../SampleSplashScreen.csproj | 24 + .../ViewModels/MainWindowViewModel.cs | 22 + .../ViewModels/SplashWindowViewModel.cs | 29 ++ .../ViewModels/ViewModelBase.cs | 10 + e2e/SampleSplashScreen/Views/MainWindow.axaml | 46 ++ .../Views/MainWindow.axaml.cs | 15 + .../Views/SplashWindow.axaml | 32 ++ .../Views/SplashWindow.axaml.cs | 11 + e2e/SampleSplashScreen/app.manifest | 18 + 15 files changed, 832 insertions(+) create mode 100644 e2e/SampleSplashScreen/.editorconfig create mode 100644 e2e/SampleSplashScreen/App.axaml create mode 100644 e2e/SampleSplashScreen/App.axaml.cs create mode 100644 e2e/SampleSplashScreen/Assets/avalonia-logo.ico create mode 100644 e2e/SampleSplashScreen/Program.cs create mode 100644 e2e/SampleSplashScreen/SampleSplashScreen.csproj create mode 100644 e2e/SampleSplashScreen/ViewModels/MainWindowViewModel.cs create mode 100644 e2e/SampleSplashScreen/ViewModels/SplashWindowViewModel.cs create mode 100644 e2e/SampleSplashScreen/ViewModels/ViewModelBase.cs create mode 100644 e2e/SampleSplashScreen/Views/MainWindow.axaml create mode 100644 e2e/SampleSplashScreen/Views/MainWindow.axaml.cs create mode 100644 e2e/SampleSplashScreen/Views/SplashWindow.axaml create mode 100644 e2e/SampleSplashScreen/Views/SplashWindow.axaml.cs create mode 100644 e2e/SampleSplashScreen/app.manifest diff --git a/Prism.Avalonia.sln b/Prism.Avalonia.sln index e591931..f177e2e 100644 --- a/Prism.Avalonia.sln +++ b/Prism.Avalonia.sln @@ -76,6 +76,8 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Prism.Container.Avalonia.Sh EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleBaseApp", "e2e\SampleBaseApp\SampleBaseApp.csproj", "{0C5B43D7-BCC0-4D7D-98AD-C60AE1A1FC11}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleSplashScreen", "e2e\SampleSplashScreen\SampleSplashScreen.csproj", "{090111A3-8111-48A9-AA9B-7B5C5C5EE8D5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -142,6 +144,10 @@ Global {0C5B43D7-BCC0-4D7D-98AD-C60AE1A1FC11}.Debug|Any CPU.Build.0 = Debug|Any CPU {0C5B43D7-BCC0-4D7D-98AD-C60AE1A1FC11}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C5B43D7-BCC0-4D7D-98AD-C60AE1A1FC11}.Release|Any CPU.Build.0 = Release|Any CPU + {090111A3-8111-48A9-AA9B-7B5C5C5EE8D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {090111A3-8111-48A9-AA9B-7B5C5C5EE8D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {090111A3-8111-48A9-AA9B-7B5C5C5EE8D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {090111A3-8111-48A9-AA9B-7B5C5C5EE8D5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -166,6 +172,7 @@ Global {4F7E8EC6-D5E5-4DD9-8DC0-F03ADDD508CF} = {966DDDE9-D31A-404B-9F24-5378DE8A12C8} {BD42A7D6-A84D-4D27-9C28-7F6A2EC477F1} = {966DDDE9-D31A-404B-9F24-5378DE8A12C8} {0C5B43D7-BCC0-4D7D-98AD-C60AE1A1FC11} = {5F8D330E-F611-4E17-8217-F2D6CDB8E1F7} + {090111A3-8111-48A9-AA9B-7B5C5C5EE8D5} = {5F8D330E-F611-4E17-8217-F2D6CDB8E1F7} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D260344D-8648-441D-B85B-9D280005F098} diff --git a/e2e/SampleSplashScreen/.editorconfig b/e2e/SampleSplashScreen/.editorconfig new file mode 100644 index 0000000..78d337e --- /dev/null +++ b/e2e/SampleSplashScreen/.editorconfig @@ -0,0 +1,430 @@ +# Copyright 2022 Xeno Innovations, Inc. +# https://github.com/xenoinc/CodeDevOps +# Revision: 6.3 +# +# This EditorConfig file provides consistent coding styles and formatting +# structures for your team's projects while preserving your personal defaults. +# +# Revision Log +# 6.3 2024-12-16 - Reduced warnings, ignore generated XAML bullshit, added SVG +# 6.2 2023-xx-xx - Upgraded vsspell_code_analyzer into EditorConfig +# 6.1 2022-01-21 - Updated rules to include StyleCopAnalyzers. Added Static ReadOnly PascalCase from _camelCase. +# 6.0 2022-01-10 - Included defaults from Microsoft to override custom settings +# 5.2 2021-10-11 - Uniform C# spacing rules and labeled code formatting rules +# 5.1 2021-09-14 - Added PowerShell and Markdown rules +# 5 2021-08-26 - C# StyleCop rules +# 4a 2021-01-17 - C# StyleCop rules +# 4 2020-05-10 - C# coding standards +# 3c 2020-04-18 - Split file filters into their own sections +# 3b 2019-03-24 - Included additional rules +# 3 2017-07-31 - Basic +# +# References: +# - https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/code-style-rule-options +# - https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ +# - https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/formatting-rules +# - https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/language-rules +# - https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/naming-rules +# - https://github.com/dotnet/roslyn/blob/main/.editorconfig +# - https://github.com/microsoft/microsoft-ui-xaml/blob/master/.editorconfig +# + +# Top-most EditorConfig file +root = true + +# All generic files should use MSDOS style endings, not Unix (lf) +[*] +end_of_line = crlf +indent_style = space + +# VSSPELL: Spell checker settings for all files +vsspell_section_id = 844a496250374d009d0aa76e9df49c5a +#vsspell_ignored_words_844a496250374d009d0aa76e9df49c5a = \transform|csharp|flexify|Guid|ble|html|htmlx|hunspells|jquery|json|mimetype|nav|plaintext|resheader|Suess|Soll|uuid|xaml|xml +vsspell_ignored_words_844a496250374d009d0aa76e9df49c5a = File:IgnoredWords.dic +vsspell_exclusion_expressions_844a496250374d009d0aa76e9df49c5a = [a-z]{2}-([A-Z]{2}|Cyrl|Latn)(?@@PND@@/Options/None)\\\\\w+(?@@PND@@/Options/None) +vsspell_dictionary_languages_844a496250374d009d0aa76e9df49c5a = en-US + +vsspell_code_analyzer_ignore_identifier_if_private = true +vsspell_code_analyzer_ignore_identifier_if_internal = true +vsspell_code_analyzer_ignore_identifier_if_all_uppercase = true +vsspell_code_analyzer_ignore_identifiers_within_member_bodies = true +vsspell_code_analyzer_ignore_if_compiler_generated = true +vsspell_code_analyzer_ignore_delimited_comments = true +vsspell_code_analyzer_ignore_quadruple_slash_comments = true +vsspell_code_analyzer_apply_to_all_c_style_languages = true + +[*.{cs,csx}] +indent_style = space +indent_size = 2 +tab_width = 2 +charset = utf-8-bom +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{c,cpp,h}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +cpp_indent_case_contents = true +cpp_indent_case_contents_when_block = true +cpp_indent_case_labels = true + +[*.sql] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.{xml,xaml,axml,axaml}] +indent_style = space +indent_size = 2 +charset = utf-8-bom +trim_trailing_whitespace = true + +[*.json] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.sln] +indent_size = 2 + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Xml config files +[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.svg] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# PList Files +[*.plist] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# YAML files +[*.{yaml,yml}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Shell script files +[*.sh] +end_of_line = lf +indent_style = space +indent_size = 2 + +# Powershell +[*.{ps1,psd1,psm1}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.md] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +# C# Ruleset +[*.{cs,csx}] +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +## Formatting - new line options +### Require braces to be on a new line for (also known as "Allman" style) +### accessors, methods, object_collection, control_blocks, types, properties, lambdas +csharp_new_line_before_open_brace = all +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +## Spaces +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_parameter_list_parentheses = false + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Organize Usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true +file_header_template = unset +# file_header_template = Copyright Xeno Innovations, Inc. 2022\nSee the LICENSE file in the project root for more information. + +# this. and Me. preferences +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity + +# Modifier preferences +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_require_accessibility_modifiers = for_non_interface_members +dotnet_style_readonly_field = true + +# Expression-level preferences +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_conditional_expression_over_assignment = true +dotnet_style_prefer_conditional_expression_over_return = true +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true + +# Parameter preferences +dotnet_code_quality_unused_parameters = all + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +# New line preferences +#dotnet_diagnostic.IDE2000.severity = warning +dotnet_style_allow_multiple_blank_lines_experimental = false:error + +# dotnet_diagnostic.IDE2001.severity = none +csharp_style_allow_embedded_statements_on_same_line_experimental = false + +# dotnet_diagnostic.IDE2002.severity = warning +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false + +# dotnet_diagnostic.IDE2003.severity = error +dotnet_style_allow_statement_immediately_after_block_experimental = false:error + +# Naming Conventions +## Async methods must use "Async" suffix +dotnet_naming_rule.async_methods_end_in_async.symbols = any_async_methods +dotnet_naming_rule.async_methods_end_in_async.style = end_in_async +dotnet_naming_rule.async_methods_end_in_async.severity = error +dotnet_naming_symbols.any_async_methods.applicable_kinds = method +dotnet_naming_symbols.any_async_methods.applicable_accessibilities = * +dotnet_naming_symbols.any_async_methods.required_modifiers = async +dotnet_naming_style.end_in_async.capitalization = pascal_case +dotnet_naming_style.end_in_async.required_prefix = +dotnet_naming_style.end_in_async.required_suffix = Async +dotnet_naming_style.end_in_async.word_separator = + +## private fields must prefix with an underscore +dotnet_naming_rule.private_members_with_underscore.symbols = private_fields +dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore +dotnet_naming_rule.private_members_with_underscore.severity = error +dotnet_naming_symbols.private_fields.applicable_kinds = field +dotnet_naming_symbols.private_fields.applicable_accessibilities = private +dotnet_naming_style.prefix_underscore.capitalization = camel_case +dotnet_naming_style.prefix_underscore.required_prefix = _ + +## private static fields must use PascalCase (overrides '_' based on SA1311) +dotnet_naming_rule.private_static_field_naming.symbols = private_static_field_naming +dotnet_naming_rule.private_static_field_naming.style = pascal_case_style +dotnet_naming_rule.private_static_field_naming.severity = error +dotnet_naming_symbols.private_static_field_naming.applicable_kinds = field +dotnet_naming_symbols.private_static_field_naming.applicable_accessibilities = private +dotnet_naming_symbols.private_static_field_naming.required_modifiers = static, readonly +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +## Constant fields must use PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = error +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +## Interfaces must have an I suffix +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.severity = error +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i +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_style.begins_with_i.capitalization = pascal_case +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 = + +## Types and Non-Field Members must be PascalCase +dotnet_naming_rule.types_should_be_pascal_case.severity = error +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case +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_rule.non_field_members_should_be_pascal_case.severity = error +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 +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 = + +## Code Style Rules +# IDE1005: Use conditional delegate call +csharp_style_conditional_delegate_call = true +# IDE1005: Delegate invocation can be simplified. +dotnet_diagnostic.IDE1005.severity = warning +# IDE1006: Naming Styles +dotnet_diagnostic.IDE1006.severity = error +# IDEOOO8: Use of var +dotnet_diagnostic.IDE0008.severity = none +# IDE0010: Add missing cases +dotnet_diagnostic.IDE0010.severity = none +# IDE0011: Add braces +csharp_prefer_braces = when_multiline +# IDE0025: Use expression body for properties +csharp_style_expression_bodied_properties = true +# IDE0026: Use expression body for indexers +csharp_style_expression_bodied_indexers = true +# IDE0027: Use expression body for accessors +csharp_style_expression_bodied_accessors = true +# IDE0046: Convert to conditional expression +dotnet_diagnostic.IDE0046.severity = none +# IDE0058: Expression value is never used +# csharp_style_unused_value_expression_statement_preference = discard_variable +dotnet_diagnostic.IDE0058.severity = none + +## Code Quality Rules +# CA1031: Do not catch general exception types +dotnet_diagnostic.CA1031.severity = none +# CA1822: Mark members as static +##dotnet_diagnostic.CA1822.severity = none +# CA1507: Use nameof to express symbol names +dotnet_diagnostic.CA1507.severity = error + +## Compiler +# CS0618: Type or member is obsolete +##dotnet_diagnostic.CS0618.severity = error +dotnet_diagnostic.CS0618.severity = warning +# CS1591: Missing XML comment for publicly visible type or member +dotnet_diagnostic.CS1591.severity = none + +## StyleCop.Analyzers +# SA1000: Keywords should be spaced correctly +dotnet_diagnostic.SA1000.severity = error +# SA1005: Single line comments should begin with single space +dotnet_diagnostic.SA1005.severity = error +# SA1008 +# SA1025: Spacing?? +# SA1101: PrefixLocalCallsWithThis +dotnet_diagnostic.SA1101.severity = none +# SA1116: Split parameters should start on line after declaration +dotnet_diagnostic.SA1116.severity = none +# SA1118: Parameter should not span multiple lines +dotnet_diagnostic.SA1118.severity = warning +# SA1137: Elements should have the same indentation +dotnet_diagnostic.SA1137.severity = error +# SA1124: Do not use regions +dotnet_diagnostic.SA1124.severity = error +# SA1200: UsingDirectivesMustBePlacedWithinNamespace +dotnet_diagnostic.SA1200.severity = none +# SA1201: Elements should appear in the correct order +dotnet_diagnostic.SA1201.severity = error +# SA1202: Elements should be ordered by access +dotnet_diagnostic.SA1202.severity = error +# SA1203: Constants should appear before fields +dotnet_diagnostic.SA1203.severity = error +# SA1204: Static elements should appear before instance elements +dotnet_diagnostic.SA1204.severity = error +# SA1214: Readonly fields should appear before non-readonly fields +dotnet_diagnostic.SA1214.severity = error +# SA1306: Field names should begin with lower-case letter +dotnet_diagnostic.SA1306.severity = error +# SA1309: FieldNamesMustNotBeginWithUnderscore +dotnet_diagnostic.SA1309.severity = none +# SA1313: Parameter names should begin with lower-case letter +dotnet_diagnostic.SA1313.severity = error +# SA1414: Tuple types in signatures should have element names +dotnet_diagnostic.SA1414.severity = silent +# SA1503: Braces should not be omitted +dotnet_diagnostic.SA1503.severity = none +# SA1505: Opening braces should not be floowed by a blank line +dotnet_diagnostic.SA1505.severity= error +# SA1507: Code should not contain multiple blank lines in a row +dotnet_diagnostic.SA1507.severity = error +# SA1508: Closing brac should not be preceded by a blank line +dotnet_diagnostic.SA1508.severity= error +# SA1513: Closing brace should be followed by blank line +dotnet_diagnostic.SA1513.severity = error +# SA1514: Element documentation header should be preceded by blank line +dotnet_diagnostic.SA1514.severity = error +# SA1515: Single-line comment should be preceded by blank line +dotnet_diagnostic.SA1515.severity = warning +# SA1516: Elements should be separated by blank line +dotnet_diagnostic.SA1516.severity = error +# SA1600: Elements should be documented +dotnet_diagnostic.SA1600.severity = none +# SA1602: Enumeration items should not be documented +dotnet_diagnostic.SA1602.severity = none +# SA1623: Property summary documentation should match accessors +dotnet_diagnostic.SA1623.severity = warning +# SA1633: FileMustHaveHeader +dotnet_diagnostic.SA1633.severity = silent +# SA1636: File header copyright text should match +dotnet_diagnostic.SA1636.severity = none + +# Default severity for analyzer diagnostics with category 'StyleCop.CSharp.SpacingRules' SA1028: Code should not contain trailing whitespace +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.SpacingRules.severity = error + +dotnet_diagnostic.VSSpell001.severity = suggestion +dotnet_diagnostic.VSSpell002.severity = none + +# SA0001: XML comment analysis is disabled due to project configuration +dotnet_diagnostic.SA0001.severity = none + +# Generated XAML bullshit +[*.sg.cs] +# CS1591: Missing XML comment for publicly visible type or member +dotnet_diagnostic.CS1591.severity = none +dotnet_analyzer_diagnostic.CS1591.severity = none +# generated_code = true + +[WindowsAppSDK-VersionInfo.cs] +dotnet_diagnostic.CS1591.severity = none diff --git a/e2e/SampleSplashScreen/App.axaml b/e2e/SampleSplashScreen/App.axaml new file mode 100644 index 0000000..00c79b8 --- /dev/null +++ b/e2e/SampleSplashScreen/App.axaml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/e2e/SampleSplashScreen/App.axaml.cs b/e2e/SampleSplashScreen/App.axaml.cs new file mode 100644 index 0000000..ffa930f --- /dev/null +++ b/e2e/SampleSplashScreen/App.axaml.cs @@ -0,0 +1,156 @@ +using System.Diagnostics; +using System.Threading.Tasks; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.ApplicationLifetimes; +using Prism.DryIoc; +using Prism.Ioc; +using Prism.Mvvm; +using Prism.Navigation.Regions; +using SampleSplashScreen.ViewModels; +using SampleSplashScreen.Views; + +namespace SampleSplashScreen; + +public partial class App : PrismApplication +{ + public override void Initialize() + { + // Performs wire-ups + Debug.WriteLine("1 - Initialize()"); + + base.Initialize(); + } + + /// Register Services and Views. + /// + protected override void RegisterTypes(IContainerRegistry containerRegistry) + { + Debug.WriteLine("2 - RegisterTypes()"); + } + + protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings) + { + Debug.WriteLine("3 - ConfigureRegionAdapterMappings()"); + + base.ConfigureRegionAdapterMappings(regionAdapterMappings); + } + + protected override AvaloniaObject CreateShell() + { + Debug.WriteLine("4 - CreateShell()"); + + // Set our starting window as the Splash-screen Window + return Container.Resolve(); + } + + protected override void InitializeModules() + { + Debug.WriteLine("5 - InitializeModules()"); + + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime) + { + // Doing this method will result in, "Dispatcher Shutdown" error because + // the window was shutdown. + + //var splash = new SplashWindow(); + //splash.Show(); + + try + { + base.InitializeModules(); + //// System.Threading.Tasks.Task.Run(() => base.InitializeModules()); + } + finally + { + //splash.Close(); + } + } + else + { + base.InitializeModules(); + } + } + + /// Called after Initialize. + protected override void OnInitialized() + { + Debug.WriteLine("6 - OnInitialized() - This shows the window set by, CreateShell() and InitializeShell()"); + + // Executes, MainWindow?.Show(); + base.OnInitialized(); + } + + /// Framework initialization completed. Set the main window. + public override async void OnFrameworkInitializationCompleted() + { + Debug.WriteLine("7 - OnFrameworkInitializationCompleted()"); + + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime) + { + // Grab current window (splash screen) to close it later. + var splashInstance = this.MainWindow; + + // Perform splash screen initialization stuff here + await OnSplashScreenAsync(); + + // --------------------------- + // Resolve the new main window + // Similar to `Initialize()`, below is a candidate for a Prism method + // to handle the switch-over on Desktop. + var newShell = (AvaloniaObject)Container.Resolve(); + + if (newShell is not null) + { + // AutoWireViewModel is 'internal static' so we can't access it here + // The following is the same as, "MvvmHelpers.AutowireViewModel(newShell);" + if (newShell is Control view && + view.DataContext is null && + ViewModelLocator.GetAutoWireViewModel(view) is null) + { + ViewModelLocator.SetAutoWireViewModel(view, true); + } + + RegionManager.SetRegionManager(newShell, Container.Resolve()); + RegionManager.UpdateRegions(); + + // Set the new Shell window in Prism to MainWindow + InitializeShell(newShell); + } + + // Show (new) main window + base.OnInitialized(); + + // WARNING: + // This MUST be performed after showing the new window. + // Otherwise, your program will exit. + (splashInstance as Window)?.Close(); + } + else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime) + { + // Needs + singleViewLifetime.MainView = MainWindow as Control; + base.OnFrameworkInitializationCompleted(); + } + else + { + base.OnFrameworkInitializationCompleted(); + } + } + + /// User-defined splash screen stuff. + /// + private async Task OnSplashScreenAsync() + { + // Grab the ViewModel to update status + var vm = ((MainWindow as Window)?.DataContext as SplashWindowViewModel); + if (vm is null) + { + Debug.WriteLine("OnSplashScreen - Could not find DataContext"); + return; + } + + // Perform user's custom loading + await vm.CustomInitializationAsync(); + } +} diff --git a/e2e/SampleSplashScreen/Assets/avalonia-logo.ico b/e2e/SampleSplashScreen/Assets/avalonia-logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..e16d84d5d02bdbba5febbea00d4e865ff81ec061 GIT binary patch literal 16958 zcmds-4{%gR9mn?wZFE3WXH=xMjfxJaMVdfJ0wkA&1nP(|I*fIgp)kY0kYIZ>NgI;8 z+>sJWlSrZbDIh}|N~vQjb%w#I#SZC=)u|nWjO{RvN>7MZioliX^eRVwet$2w>E7eL zynV^LD8~d&RF}eO*3jgY%5sz(PITaiakE_!9TSZ1`c-?u3xjYsLqJv&#O8=^I~PkyAJxc zRekA71D_qcj73Ten)6mp2*a_?eb^<#+QCy$cUfghW zUrBHw*vUcPOBbuTTn%;^gWgC}XmWGjiaPLr0CsZ0PGF}UvmT+{vo|=g^XDVN?}D8o z8-f&EP;(XRG*tGTvm0s8oaT(+PqM!UE8ExBMjmOV=882mTy}2zy(Pg>=XcZY8`18~ zbG>1IYEBdVq$D(|{I1y1H-ZamJ!yAl=eFNp+A?bVZrNK_)p^R!ZGXTYNjpC{CqRdx zBPLzIwe54ReD)6deQ&UMwVSanig(b8A5rhZUOswr}umNcj~EiLx^KHRkE{H`TOILMQ;X|(KBfK zgXNE=h2JZ7_8)WFDkpYs_tr*(U4x(df{%VvS3`%&H+jzQB|GzjeIDktJ%i0@H`g}F zXGW7>(50>~(~Aqeeg3^>Z7dn zP}Z=y3lQi*{!|HY@jslz`a>pwNNV9$n5Dls@-KW(Y6vuORUCnGS!s>f1=2gMA#d1X|p1&(d3eT=dXvuz!SkoyyK@_>Nx+u@*}shzKCIWowom_>XX&EOZJp^oK<<82A{`6zlP{y*B!LO|IlFUaz4KwbJ~G< zzbxB||Ll_s=*Ye8I{YhTIaW5^?99(P9$0Sd*YTbe@7u`ryIjZdT88KISkD}NwtQ2{ z9=Xc@{-N>2&%7r473}?e+KQXglI%KrR@cpK?8=0%1MM!^+5ThiblO$Yzh5~BJAs{^ zD{uSn;fl@sep<0*(a+{SKKTzD))n>cnje3wbp^e=L~Fh)`^95+ex{NARh3&kf31G` zVC^p13G4)R0y|;sk}Pg5eGNK*(`(gD zH6zH*ecra+)i|7cY8G|P>)*FZKJT8hpK7V*G3OkV@;y_U+THSbSDDS{XSUCyXXk~D zy_@9o?p2?sHy?fw>|>2F7xnha7=V2eWc7WVe6LG8?6JH|$j% zbSk_?WtTDFelQX2FF}&g&R#iQ;YZmMKvZ!}=74i z!T&$xxyOpvoQ66-2c6QWTWtrO^Ajj@Jos4Og36&vs1TY6`J^w%Hy`TL@PU7Wkq@bR zEOui+FYjxvkF8hwlevmSUl4Y1J`q)sP1!f;_F3;*3`P}sRly*0lmmx7oN4vj=I1S1! zW8oqO{Qj`qn~`Nn>!KgHVJ}3vI%AzSyYyEx20VAjmiIVWjTpFL_pHy``K=KHSNvSh zATh`&b{P|g7`W!Qi2<|gj&*a=)#oL%*&+t7Lss*GA@M6Qcm^!IUeKD`B=7q=@=w>$ zL^H=wufhIXU4G=d8~Vmj>&nFYT=M&oUwfXIiM(c?T=JJ9znm*;&5_LYW!g1(P9&Mk zW59LKKk`ZbQH=ro7+4PuH=Zc#E70E|xBNqn0qU9worZXhbJ!zbOnG|A><`TMD9Zv7a|{P4FD(&+~} z>{|OaqsePkw+AuccE2InWjuxv1OENV4b47`7~C}MLx{l*-{&Q>*=jrsH!Zu2MKT5- zz?#SXo1R^XK_2+|d*}Bdp7$Mrw0?^#%kat)Q9L(+|3tBz$XEdzy%mMSc5@xDk)&mV z>%OE-ByGIk_9qMCWE4PgF-G7Qh7`jU+bI6C?G|4&Y(x~5@pVK5jBC_CV7DS2eu*Cb zJSQPqU`0+`lnP&;$c>4+gfAidT%s>7!riDbE5;?kMtuY$vb(bkhq5BshMzvZ-8gW& zarjNvNdJN`^5NXL&mZ*}<%GNY%cV#**Mllh8WQ15LWHBJ!rv#tF-{~Aj^lPjEu8Sj ze6V#u!4X-Xv;k?uMAwiW@FxWFbq8|eA`8(E BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace(); +} diff --git a/e2e/SampleSplashScreen/SampleSplashScreen.csproj b/e2e/SampleSplashScreen/SampleSplashScreen.csproj new file mode 100644 index 0000000..8d68117 --- /dev/null +++ b/e2e/SampleSplashScreen/SampleSplashScreen.csproj @@ -0,0 +1,24 @@ + + + WinExe + net8.0 + enable + Damian Suess + true + app.manifest + true + latest + + + + + + + + + + + + + + diff --git a/e2e/SampleSplashScreen/ViewModels/MainWindowViewModel.cs b/e2e/SampleSplashScreen/ViewModels/MainWindowViewModel.cs new file mode 100644 index 0000000..dad34f0 --- /dev/null +++ b/e2e/SampleSplashScreen/ViewModels/MainWindowViewModel.cs @@ -0,0 +1,22 @@ +using Prism.Commands; + +namespace SampleSplashScreen.ViewModels; + +public class MainWindowViewModel : ViewModelBase +{ + private int _clickCounter = 0; + + public MainWindowViewModel() + { + Title = "Welcome to Prism.Avalonia, sponsored by Suess Labs!"; + } + + public string Greeting => "Welcome to Prism.Avalonia!"; + + public int ClickCounter { get => _clickCounter; set => SetProperty(ref _clickCounter, value); } + + public DelegateCommand CmdIncrementCounter => new(() => + { + ClickCounter++; + }); +} diff --git a/e2e/SampleSplashScreen/ViewModels/SplashWindowViewModel.cs b/e2e/SampleSplashScreen/ViewModels/SplashWindowViewModel.cs new file mode 100644 index 0000000..e79bdb0 --- /dev/null +++ b/e2e/SampleSplashScreen/ViewModels/SplashWindowViewModel.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; + +namespace SampleSplashScreen.ViewModels; + +public class SplashWindowViewModel : ViewModelBase +{ + private string _status = string.Empty; + + public SplashWindowViewModel() + { + Title = "Prism.Avalonia Splash Screen"; + } + + public string Greeting => "Prism Avalonia is starting"; + + public string Status { get => _status; set => SetProperty(ref _status, value); } + + public async Task CustomInitializationAsync() + { + Status = "3"; + await Task.Delay(1000); + + Status = "2"; + await Task.Delay(1000); + + Status = "1"; + await Task.Delay(1000); + } +} diff --git a/e2e/SampleSplashScreen/ViewModels/ViewModelBase.cs b/e2e/SampleSplashScreen/ViewModels/ViewModelBase.cs new file mode 100644 index 0000000..bb1167c --- /dev/null +++ b/e2e/SampleSplashScreen/ViewModels/ViewModelBase.cs @@ -0,0 +1,10 @@ +using Prism.Mvvm; + +namespace SampleSplashScreen.ViewModels; + +public class ViewModelBase : BindableBase +{ + private string _title = string.Empty; + + public string Title { get => _title; set => SetProperty(ref _title, value); } +} diff --git a/e2e/SampleSplashScreen/Views/MainWindow.axaml b/e2e/SampleSplashScreen/Views/MainWindow.axaml new file mode 100644 index 0000000..3faf8a6 --- /dev/null +++ b/e2e/SampleSplashScreen/Views/MainWindow.axaml @@ -0,0 +1,46 @@ + + + + + + + + + + +