From 015d7d45421f77533f210a4283b229ab4c75beca Mon Sep 17 00:00:00 2001 From: Matthias Heil Date: Sat, 4 Apr 2026 15:36:30 +0200 Subject: [PATCH] Working with warnings --- .../Applications/AvaloniaLoggingDI/App.axaml | 2 +- .../AvaloniaLoggingDI/App.axaml.cs | 53 ++++--- .../AvaloniaLoggingDI.csproj | 7 + .../AvaloniaLoggingDI/ViewLocator.cs | 21 ++- .../AvaloniaLoggingDI/Views/MainWindow.axaml | 2 +- .../AvaloniaLoggingNoDI/App.axaml | 2 +- .../AvaloniaLoggingNoDI/App.axaml.cs | 21 ++- .../AvaloniaLoggingNoDI.csproj | 8 + .../Views/MainWindow.axaml | 2 +- .../Applications/AvaloniaSerilogDI/App.axaml | 2 +- .../AvaloniaSerilogDI/App.axaml.cs | 148 ++++++++---------- .../AvaloniaSerilogDI.csproj | 6 + .../AvaloniaSerilogDI/ViewLocator.cs | 21 ++- .../AvaloniaSerilogDI/Views/MainWindow.axaml | 2 +- .../AvaloniaSerilogNoDI/App.axaml | 2 +- .../AvaloniaSerilogNoDI.csproj | 6 + .../Helpers/LoggingHelper.cs | 8 +- .../AvaloniaSerilogNoDI/MainWindow.axaml | 2 +- .../LogViewer.Avalonia.csproj | 46 +++--- .../LogViewer.Avalonia/LogViewerControl.axaml | 2 +- .../LogViewerControl.axaml.cs | 7 +- 21 files changed, 211 insertions(+), 159 deletions(-) diff --git a/CSharp/Applications/AvaloniaLoggingDI/App.axaml b/CSharp/Applications/AvaloniaLoggingDI/App.axaml index d737483..9b23eab 100644 --- a/CSharp/Applications/AvaloniaLoggingDI/App.axaml +++ b/CSharp/Applications/AvaloniaLoggingDI/App.axaml @@ -10,7 +10,7 @@ - + \ No newline at end of file diff --git a/CSharp/Applications/AvaloniaLoggingDI/App.axaml.cs b/CSharp/Applications/AvaloniaLoggingDI/App.axaml.cs index a54dbc5..0c66151 100644 --- a/CSharp/Applications/AvaloniaLoggingDI/App.axaml.cs +++ b/CSharp/Applications/AvaloniaLoggingDI/App.axaml.cs @@ -1,23 +1,23 @@ -using System; -using System.Drawing; -using System.Reflection; -using System.Threading; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Data.Core; using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; using AvaloniaLoggingDI.ViewModels; using AvaloniaLoggingDI.Views; using LogViewer.Avalonia; -using MessageBox.Avalonia; -using MessageBox.Avalonia.Enums; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using MsBox.Avalonia; +using MsBox.Avalonia.Enums; using MsLogger.Core; using RandomLogging.Service; -using Icon = MessageBox.Avalonia.Enums.Icon; +using System; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Threading; +using Icon = MsBox.Avalonia.Enums.Icon; namespace AvaloniaLoggingDI; @@ -30,9 +30,9 @@ public partial class App : Application { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - // Line below is needed to remove Avalonia data validation. - // Without this line you will get duplicate validations from both Avalonia and CT - ExpressionObserver.DataValidators.RemoveAll(x => x is DataAnnotationsValidationPlugin); + // Avoid duplicate validations from both Avalonia and the CommunityToolkit. + // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins + DisableAvaloniaDataAnnotationValidation(); // catch all unhandled errors AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; @@ -94,7 +94,7 @@ public partial class App : Application _host = builder.Build(); _cancellationTokenSource = new(); - + try { LogStartingMode(); @@ -119,7 +119,17 @@ public partial class App : Application base.OnFrameworkInitializationCompleted(); } + private static void DisableAvaloniaDataAnnotationValidation() + { + // Get an array of plugins to remove + var dataValidationPluginsToRemove = BindingPlugins.DataValidators.OfType().ToArray(); + // remove each entry found + foreach (var plugin in dataValidationPluginsToRemove) + { + BindingPlugins.DataValidators.Remove(plugin); + } + } private void OnShutdownRequested(object? sender, ShutdownRequestedEventArgs e) => _ = _host!.StopAsync(_cancellationTokenSource!.Token); @@ -133,24 +143,27 @@ public partial class App : Application private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) => ShowMessageBox("Unhandled Error", ((Exception)e.ExceptionObject).Message); - private void ShowMessageBox(string title, string message) + private static void ShowMessageBox(string title, string message) { - MessageBox.Avalonia.BaseWindows.Base.IMsBoxWindow messageBoxStandardWindow = MessageBoxManager - .GetMessageBoxStandardWindow(title, message, ButtonEnum.Ok, Icon.Stop); - - messageBoxStandardWindow.Show(); - } + var box = MessageBoxManager.GetMessageBoxStandard( + "Exception", + text: message, + ButtonEnum.Ok, + Icon.Stop + ); + _ = box.ShowAsync().GetAwaiter(); + } private void LogStartingMode() { // Get the Launch mode bool isDevelopment = string.Equals(Environment.GetEnvironmentVariable("DOTNET_MODIFIABLE_ASSEMBLIES"), "debug", - StringComparison.InvariantCultureIgnoreCase); + StringComparison.OrdinalIgnoreCase); // initialize a logger & EventId ILogger logger = _host!.Services.GetRequiredService>(); EventId eventId = new EventId(id: 0, name: Assembly.GetEntryAssembly()!.GetName().Name); - + // log a test pattern for each log level logger.TestPattern(eventId: eventId); diff --git a/CSharp/Applications/AvaloniaLoggingDI/AvaloniaLoggingDI.csproj b/CSharp/Applications/AvaloniaLoggingDI/AvaloniaLoggingDI.csproj index a7349ff..4d6e118 100644 --- a/CSharp/Applications/AvaloniaLoggingDI/AvaloniaLoggingDI.csproj +++ b/CSharp/Applications/AvaloniaLoggingDI/AvaloniaLoggingDI.csproj @@ -4,6 +4,9 @@ true app.manifest + + + @@ -31,4 +34,8 @@ + + + + diff --git a/CSharp/Applications/AvaloniaLoggingDI/ViewLocator.cs b/CSharp/Applications/AvaloniaLoggingDI/ViewLocator.cs index aad5e69..39722d7 100644 --- a/CSharp/Applications/AvaloniaLoggingDI/ViewLocator.cs +++ b/CSharp/Applications/AvaloniaLoggingDI/ViewLocator.cs @@ -2,15 +2,24 @@ using Avalonia.Controls; using Avalonia.Controls.Templates; using AvaloniaLoggingDI.ViewModels; using System; +using System.Diagnostics.CodeAnalysis; namespace AvaloniaLoggingDI; - +// +/// Given a view model, returns the corresponding view if possible. +/// +[RequiresUnreferencedCode( + "Default implementation of ViewLocator involves reflection which may be trimmed away.", + Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")] public class ViewLocator : IDataTemplate { - public IControl Build(object data) + public Control? Build(object? param) { - string name = data.GetType().FullName!.Replace("ViewModel", "View"); - Type? type = Type.GetType(name); + if (param is null) + return null; + + var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); + var type = Type.GetType(name); if (type != null) { @@ -20,8 +29,8 @@ public class ViewLocator : IDataTemplate return new TextBlock { Text = "Not Found: " + name }; } - public bool Match(object data) + public bool Match(object? data) { return data is ViewModelBase; } -} \ No newline at end of file +} diff --git a/CSharp/Applications/AvaloniaLoggingDI/Views/MainWindow.axaml b/CSharp/Applications/AvaloniaLoggingDI/Views/MainWindow.axaml index d5caafa..4e73e0b 100644 --- a/CSharp/Applications/AvaloniaLoggingDI/Views/MainWindow.axaml +++ b/CSharp/Applications/AvaloniaLoggingDI/Views/MainWindow.axaml @@ -11,7 +11,7 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" Title="C# AVALONIA | LogViewer Control Example - Dot Net 7.0" - Icon="avares://Avalonia.Resources/Assets/avalonia-logo.ico" + Icon="/Assets/avalonia-logo.ico" WindowStartupLocation="CenterScreen" Height="634" Width="600"> diff --git a/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml b/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml index 7c51521..dc9b28d 100644 --- a/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml +++ b/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml @@ -3,7 +3,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - + \ No newline at end of file diff --git a/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml.cs b/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml.cs index fb38bcc..4f78c64 100644 --- a/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml.cs +++ b/CSharp/Applications/AvaloniaLoggingNoDI/App.axaml.cs @@ -4,6 +4,7 @@ using Avalonia.Data.Core; using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; using AvaloniaLoggingNoDI.Views; +using System.Linq; namespace AvaloniaLoggingNoDI; @@ -18,12 +19,24 @@ public partial class App : Application { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - // Line below is needed to remove Avalonia data validation. - // Without this line you will get duplicate validations from both Avalonia and CT - ExpressionObserver.DataValidators.RemoveAll(x => x is DataAnnotationsValidationPlugin); - desktop.MainWindow = new MainWindow(); + // Avoid duplicate validations from both Avalonia and the CommunityToolkit. + // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins + DisableAvaloniaDataAnnotationValidation(); + desktop.MainWindow = new MainWindow(); } base.OnFrameworkInitializationCompleted(); } + private static void DisableAvaloniaDataAnnotationValidation() + { + // Get an array of plugins to remove + var dataValidationPluginsToRemove = + BindingPlugins.DataValidators.OfType().ToArray(); + + // remove each entry found + foreach (var plugin in dataValidationPluginsToRemove) + { + BindingPlugins.DataValidators.Remove(plugin); + } + } } \ No newline at end of file diff --git a/CSharp/Applications/AvaloniaLoggingNoDI/AvaloniaLoggingNoDI.csproj b/CSharp/Applications/AvaloniaLoggingNoDI/AvaloniaLoggingNoDI.csproj index 38c4b0f..2dd7c80 100644 --- a/CSharp/Applications/AvaloniaLoggingNoDI/AvaloniaLoggingNoDI.csproj +++ b/CSharp/Applications/AvaloniaLoggingNoDI/AvaloniaLoggingNoDI.csproj @@ -6,6 +6,14 @@ app.manifest + + + + + + + + PreserveNewest diff --git a/CSharp/Applications/AvaloniaLoggingNoDI/Views/MainWindow.axaml b/CSharp/Applications/AvaloniaLoggingNoDI/Views/MainWindow.axaml index d50e7e2..8a38025 100644 --- a/CSharp/Applications/AvaloniaLoggingNoDI/Views/MainWindow.axaml +++ b/CSharp/Applications/AvaloniaLoggingNoDI/Views/MainWindow.axaml @@ -11,7 +11,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="C# AVALONIA MINIMAL | LogViewer Control Example - Dot Net 7.0" - Icon="avares://Avalonia.Resources/Assets/avalonia-logo.ico" + Icon="/Assets/avalonia-logo.ico" WindowStartupLocation="CenterScreen" Height="634" Width="600"> diff --git a/CSharp/Applications/AvaloniaSerilogDI/App.axaml b/CSharp/Applications/AvaloniaSerilogDI/App.axaml index 8e2e882..c47bc6e 100644 --- a/CSharp/Applications/AvaloniaSerilogDI/App.axaml +++ b/CSharp/Applications/AvaloniaSerilogDI/App.axaml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/CSharp/Applications/AvaloniaSerilogDI/App.axaml.cs b/CSharp/Applications/AvaloniaSerilogDI/App.axaml.cs index 5a9c54a..013c212 100644 --- a/CSharp/Applications/AvaloniaSerilogDI/App.axaml.cs +++ b/CSharp/Applications/AvaloniaSerilogDI/App.axaml.cs @@ -1,6 +1,5 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Data.Core; using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; using AvaloniaSerilogDI.ViewModels; @@ -8,28 +7,28 @@ using AvaloniaSerilogDI.Views; using Common.Core.Extensions; using LogViewer.Avalonia; using LogViewer.Core; -using MessageBox.Avalonia; -using MessageBox.Avalonia.Enums; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using MsBox.Avalonia; +using MsBox.Avalonia.Enums; using RandomLogging.Service; using Serilog; using Serilog.Sinks.LogView.Core; using System; -using System.Drawing; +using System.Globalization; +using System.Linq; using System.Reflection; using System.Threading; -using Icon = MessageBox.Avalonia.Enums.Icon; - +using Icon = MsBox.Avalonia.Enums.Icon; namespace AvaloniaSerilogDI; public partial class App : Application { #region Constructors - + public override void Initialize() - => AvaloniaXamlLoader.Load(this); + => AvaloniaXamlLoader.Load(this); #endregion @@ -42,91 +41,58 @@ public partial class App : Application #region Methods - public override void OnFrameworkInitializationCompleted() + public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - // Line below is needed to remove Avalonia data validation. - // Without this line you will get duplicate validations from both Avalonia and CT - ExpressionObserver.DataValidators.RemoveAll(x => x is DataAnnotationsValidationPlugin); - + // Avoid duplicate validations from both Avalonia and the CommunityToolkit. + // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins + DisableAvaloniaDataAnnotationValidation(); // catch all unhandled errors AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; HostApplicationBuilder builder = Host.CreateApplicationBuilder(); - builder - // Register the Random Logging Service - .AddRandomBackgroundService() + builder + // Register the Random Logging Service + .AddRandomBackgroundService() - // visual debugging tools - .AddLogViewer(); + // visual debugging tools + .AddLogViewer(); - IServiceCollection services = builder.Services; + IServiceCollection services = builder.Services; - // Serilog Logger + // Serilog Logger - // Azure: https://devblogs.microsoft.com/dotnet/asp-net-core-logging/ - // ApplicationInsights: https://github.com/serilog-contrib/serilog-sinks-applicationinsights - // AmazonCloudWatch: https://blog.ivankahl.com/logging-dotnet-to-aws-cloudwatch-using-serilog/ - // video: https://www.youtube.com/watch?v=nVAkSBpsuTk (How Structured Logging With Serilog Can Make Your Life Easier) - // video: https://www.youtube.com/watch?v=_iryZxv8Rxw (C# Logging with Serilog and Seq - Structured Logging Made Easy) - // ps: docker run -d --restart unless-stopped --name seq -e ACCEPT_EULA=Y -v c:\WIP\LogData:/data -p 8081:80 datalust/seq:latest - // docker rmi datalust/seq --force + // Azure: https://devblogs.microsoft.com/dotnet/asp-net-core-logging/ + // ApplicationInsights: https://github.com/serilog-contrib/serilog-sinks-applicationinsights + // AmazonCloudWatch: https://blog.ivankahl.com/logging-dotnet-to-aws-cloudwatch-using-serilog/ + // video: https://www.youtube.com/watch?v=nVAkSBpsuTk (How Structured Logging With Serilog Can Make Your Life Easier) + // video: https://www.youtube.com/watch?v=_iryZxv8Rxw (C# Logging with Serilog and Seq - Structured Logging Made Easy) + // ps: docker run -d --restart unless-stopped --name seq -e ACCEPT_EULA=Y -v c:\WIP\LogData:/data -p 8081:80 datalust/seq:latest + // docker rmi datalust/seq --force - // ref: https://stackoverflow.com/questions/66304596/how-to-dependency-inject-serilog-into-the-rest-of-my-classes-in-net-console-app - services.AddLogging(configure: cfg => - { - Log.Logger = new LoggerConfiguration() - //Serilog.Core.Logger logger = new LoggerConfiguration() - .ReadFrom.Configuration(builder.Configuration) - .WriteTo.DataStoreLoggerSink( - dataStoreProvider: () => _host!.Services.TryGetService()! - - //dataStoreProvider: () => _host!.Services.TryGetService()!, - //options => - //{ - // options.Colors[LogLevel.Trace] = new() - // { - // Foreground = Color.White, - // Background = Color.DarkGray - // }; - - // options.Colors[LogLevel.Debug] = new() - // { - // Foreground = Color.White, - // Background = Color.Gray - // }; - - // options.Colors[LogLevel.Information] = new() - // { - // Foreground = Color.White, - // Background = Color.DodgerBlue - // }; - - // options.Colors[LogLevel.Warning] = new() - // { - // Foreground = Color.White, - // Background = Color.Orchid - // }; - //} - ) - .CreateLogger(); - - cfg.ClearProviders() - .AddSerilog(Log.Logger); - }); - - services - .AddSingleton() - .AddSingleton(service => new MainWindow + // ref: https://stackoverflow.com/questions/66304596/how-to-dependency-inject-serilog-into-the-rest-of-my-classes-in-net-console-app + services.AddLogging(configure: cfg => { - DataContext = service.GetRequiredService() + Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Configuration) + .WriteTo.DataStoreLoggerSink( dataStoreProvider: () => _host!.Services.TryGetService()!,formatProvider: CultureInfo.InvariantCulture) + .CreateLogger(); + + cfg.ClearProviders().AddSerilog(Log.Logger); }); + services + .AddSingleton() + .AddSingleton(service => new MainWindow + { + DataContext = service.GetRequiredService() + }); + _host = builder.Build(); _cancellationTokenSource = new(); - + try { LogStartingMode(); @@ -155,8 +121,18 @@ public partial class App : Application base.OnFrameworkInitializationCompleted(); } + private static void DisableAvaloniaDataAnnotationValidation() + { + // Get an array of plugins to remove + var dataValidationPluginsToRemove = BindingPlugins.DataValidators.OfType().ToArray(); - private void OnShutdownRequested(object? sender, ShutdownRequestedEventArgs e) + // remove each entry found + foreach (var plugin in dataValidationPluginsToRemove) + { + BindingPlugins.DataValidators.Remove(plugin); + } + } + private void OnShutdownRequested(object? sender, ShutdownRequestedEventArgs e) => CleanUp(); private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) @@ -169,23 +145,25 @@ public partial class App : Application CleanUp(); } - private void ShowMessageBox(string title, string message) + private static void ShowMessageBox(string title, string message) { - MessageBox.Avalonia.BaseWindows.Base.IMsBoxWindow messageBoxStandardWindow = MessageBoxManager - .GetMessageBoxStandardWindow(title, message, ButtonEnum.Ok, Icon.Stop); - - messageBoxStandardWindow.Show(); + var box = MessageBoxManager.GetMessageBoxStandard( + "Exception", + text: message, + ButtonEnum.Ok, + Icon.Stop + ); + _ = box.ShowAsync().GetAwaiter(); } - private void LogStartingMode() { // Get the Launch mode bool isDevelopment = string.Equals(Environment.GetEnvironmentVariable("DOTNET_MODIFIABLE_ASSEMBLIES"), "debug", - StringComparison.InvariantCultureIgnoreCase); + StringComparison.OrdinalIgnoreCase); // initialize a logger & EventId ILogger logger = _host!.Services.GetRequiredService>(); - EventId eventId = new EventId(id: 0, name: Assembly.GetEntryAssembly()!.GetName().Name); + EventId eventId = new(id: 0, name: Assembly.GetEntryAssembly()!.GetName().Name); // log a test pattern for each log level logger.TestPattern(eventId: eventId); @@ -197,7 +175,7 @@ public partial class App : Application private void CleanUp() { // tell the background services that we are shutting down - _ = _host!.StopAsync(_cancellationTokenSource!.Token); + _ = _host?.StopAsync(_cancellationTokenSource?.Token ?? CancellationToken.None); // flush logs Log.CloseAndFlush(); diff --git a/CSharp/Applications/AvaloniaSerilogDI/AvaloniaSerilogDI.csproj b/CSharp/Applications/AvaloniaSerilogDI/AvaloniaSerilogDI.csproj index 10c6bde..754c27c 100644 --- a/CSharp/Applications/AvaloniaSerilogDI/AvaloniaSerilogDI.csproj +++ b/CSharp/Applications/AvaloniaSerilogDI/AvaloniaSerilogDI.csproj @@ -4,6 +4,12 @@ true app.manifest + + + + + + diff --git a/CSharp/Applications/AvaloniaSerilogDI/ViewLocator.cs b/CSharp/Applications/AvaloniaSerilogDI/ViewLocator.cs index 0ad3c39..bf3d20e 100644 --- a/CSharp/Applications/AvaloniaSerilogDI/ViewLocator.cs +++ b/CSharp/Applications/AvaloniaSerilogDI/ViewLocator.cs @@ -2,15 +2,24 @@ using Avalonia.Controls; using Avalonia.Controls.Templates; using AvaloniaSerilogDI.ViewModels; using System; +using System.Diagnostics.CodeAnalysis; namespace AvaloniaSerilogDI; - +// +/// Given a view model, returns the corresponding view if possible. +/// +[RequiresUnreferencedCode( + "Default implementation of ViewLocator involves reflection which may be trimmed away.", + Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")] public class ViewLocator : IDataTemplate { - public IControl Build(object data) + public Control? Build(object? param) { - string name = data.GetType().FullName!.Replace("ViewModel", "View"); - Type? type = Type.GetType(name); + if (param is null) + return null; + + var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); + var type = Type.GetType(name); if (type != null) { @@ -20,8 +29,8 @@ public class ViewLocator : IDataTemplate return new TextBlock { Text = "Not Found: " + name }; } - public bool Match(object data) + public bool Match(object? data) { return data is ViewModelBase; } -} \ No newline at end of file +} diff --git a/CSharp/Applications/AvaloniaSerilogDI/Views/MainWindow.axaml b/CSharp/Applications/AvaloniaSerilogDI/Views/MainWindow.axaml index aebc5d1..2261709 100644 --- a/CSharp/Applications/AvaloniaSerilogDI/Views/MainWindow.axaml +++ b/CSharp/Applications/AvaloniaSerilogDI/Views/MainWindow.axaml @@ -11,7 +11,7 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" Title="C# AVALONIA SeriLog | LogViewer Control Example - Dot Net 7.0" - Icon="avares://Avalonia.Resources/Assets/avalonia-logo.ico" + Icon="/Assets/avalonia-logo.ico" WindowStartupLocation="CenterScreen" Height="634" Width="600"> diff --git a/CSharp/Applications/AvaloniaSerilogNoDI/App.axaml b/CSharp/Applications/AvaloniaSerilogNoDI/App.axaml index 37fa077..c5beb23 100644 --- a/CSharp/Applications/AvaloniaSerilogNoDI/App.axaml +++ b/CSharp/Applications/AvaloniaSerilogNoDI/App.axaml @@ -3,7 +3,7 @@ x:Class="AvaloniaSerilogNoDI.App"> - + \ No newline at end of file diff --git a/CSharp/Applications/AvaloniaSerilogNoDI/AvaloniaSerilogNoDI.csproj b/CSharp/Applications/AvaloniaSerilogNoDI/AvaloniaSerilogNoDI.csproj index f9ba074..131f668 100644 --- a/CSharp/Applications/AvaloniaSerilogNoDI/AvaloniaSerilogNoDI.csproj +++ b/CSharp/Applications/AvaloniaSerilogNoDI/AvaloniaSerilogNoDI.csproj @@ -4,6 +4,12 @@ true app.manifest + + + + + + diff --git a/CSharp/Applications/AvaloniaSerilogNoDI/Helpers/LoggingHelper.cs b/CSharp/Applications/AvaloniaSerilogNoDI/Helpers/LoggingHelper.cs index 3fc8514..b4b15b0 100644 --- a/CSharp/Applications/AvaloniaSerilogNoDI/Helpers/LoggingHelper.cs +++ b/CSharp/Applications/AvaloniaSerilogNoDI/Helpers/LoggingHelper.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging; using Serilog; using Serilog.Sinks.LogView.Core; using System.Drawing; +using System.Globalization; namespace AvaloniaSerilogNoDI.Helpers; @@ -21,10 +22,7 @@ public static class LoggingHelper Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) - .WriteTo.DataStoreLoggerSink( - //dataStoreProvider: () => MainControlsDataStore.DataStore - - dataStoreProvider: () => MainControlsDataStore.DataStore, + .WriteTo.DataStoreLoggerSink(dataStoreProvider: () => MainControlsDataStore.DataStore, options => { options.Colors[LogLevel.Trace] = new() @@ -50,7 +48,7 @@ public static class LoggingHelper Foreground = Color.White, Background = Color.Orchid }; - } + }, formatProvider: CultureInfo.InvariantCulture ) .CreateLogger(); diff --git a/CSharp/Applications/AvaloniaSerilogNoDI/MainWindow.axaml b/CSharp/Applications/AvaloniaSerilogNoDI/MainWindow.axaml index 476d515..de41d25 100644 --- a/CSharp/Applications/AvaloniaSerilogNoDI/MainWindow.axaml +++ b/CSharp/Applications/AvaloniaSerilogNoDI/MainWindow.axaml @@ -11,7 +11,7 @@ xmlns:control="clr-namespace:LogViewer.Avalonia;assembly=LogViewer.Avalonia" Title="C# AVALONIA | SeriLog LogViewer Control Example - Dot Net 7.0" - Icon="avares://Avalonia.Resources/Assets/avalonia-logo.ico" + Icon="/Assets/avalonia-logo.ico" WindowStartupLocation="CenterScreen" Height="634" Width="600"> diff --git a/CSharp/Controls/LogViewer.Avalonia/LogViewer.Avalonia.csproj b/CSharp/Controls/LogViewer.Avalonia/LogViewer.Avalonia.csproj index 2d4e0f5..244effc 100644 --- a/CSharp/Controls/LogViewer.Avalonia/LogViewer.Avalonia.csproj +++ b/CSharp/Controls/LogViewer.Avalonia/LogViewer.Avalonia.csproj @@ -1,29 +1,31 @@ - - enable - enable - + + enable + - - - - - - - - - - + + + + + + - - - + + + + + + - - - %(Filename) - - + + + + + + + %(Filename) + + diff --git a/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml b/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml index 361cfdc..4a5e9c4 100644 --- a/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml +++ b/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml @@ -34,7 +34,7 @@ diff --git a/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml.cs b/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml.cs index bcfb3e3..b48d679 100644 --- a/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml.cs +++ b/CSharp/Controls/LogViewer.Avalonia/LogViewerControl.axaml.cs @@ -8,7 +8,10 @@ namespace LogViewer.Avalonia; public partial class LogViewerControl : UserControl { public LogViewerControl() - => InitializeComponent(); + { + InitializeComponent(); + } + private ILogDataStoreImpl? vm; private LogModel? item; @@ -23,7 +26,7 @@ public partial class LogViewerControl : UserControl } private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) - => item = MyDataGrid.Items.Cast().LastOrDefault(); + => item = MyDataGrid.ItemsSource.Cast().LastOrDefault(); private void OnLayoutUpdated(object? sender, EventArgs e) {