Compare commits

...

3 Commits

Author SHA1 Message Date
a5adf60ba7 code cleanup 2022-11-14 20:06:15 +01:00
14f2a7242a Add zoom slider 2022-10-22 17:36:24 +02:00
644e2628e3 file-scoped namespaces and update of modernwpfui 2022-10-22 13:26:01 +02:00
25 changed files with 1097 additions and 780 deletions

6
.csharpierrc Normal file
View File

@ -0,0 +1,6 @@
{
"printWidth": 200,
"useTabs": false,
"tabWidth": 4,
"preprocessorSymbolSets": ["", "DEBUG", "DEBUG,CODE_STYLE"]
}

247
.editorconfig Normal file
View File

@ -0,0 +1,247 @@
# Entfernen Sie die folgende Zeile, wenn Sie EDITORCONFIG-Einstellungen von höheren Verzeichnissen vererben möchten.
root = true
# C#-Dateien
[*.cs]
#### Wichtige EditorConfig-Optionen ####
# Einzüge und Abstände
indent_size = 4
indent_style = space
tab_width = 4
# Einstellungen für neue Zeilen
end_of_line = crlf
insert_final_newline = true
#### .NET-Codierungskonventionen ####
# Using-Direktiven organisieren
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
file_header_template = unset
# this.- und Me.-Einstellungen
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false
# Einstellungen für Sprachschlüsselwörter und BCL-Typen
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true
# Einstellungen für Klammern
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
# Einstellungen für Modifizierer
dotnet_style_require_accessibility_modifiers = for_non_interface_members
# Einstellungen für Ausdrucksebene
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_foreach_explicit_cast_in_source = when_strongly_typed
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
# Einstellungen für Felder
dotnet_style_readonly_field = true
# Einstellungen für Parameter
dotnet_code_quality_unused_parameters = all
# Unterdrückungseinstellungen
dotnet_remove_unnecessary_suppression_exclusions = none
# Einstellungen für neue Zeilen
dotnet_style_allow_multiple_blank_lines_experimental = true
dotnet_style_allow_statement_immediately_after_block_experimental = true
#### C#-Codierungskonventionen ####
# Var-Einstellungen
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = false
# Ausdruckskörpermember
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
# Einstellungen für den Musterabgleich
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_extended_property_pattern = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_switch_expression = true:suggestion
# Einstellungen für NULL-Überprüfung
csharp_style_conditional_delegate_call = true
# Einstellungen für Modifizierer
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
csharp_style_prefer_readonly_struct = true
# Einstellungen für Codeblöcke
csharp_prefer_braces = true:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = block_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_top_level_statements = true:silent
# Einstellungen für Ausdrucksebene
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_local_over_anonymous_function = true:suggestion
csharp_style_prefer_null_check_over_type_check = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
csharp_style_prefer_tuple_swap = true:suggestion
csharp_style_prefer_utf8_string_literals = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
# Einstellungen für using-Anweisungen
csharp_using_directive_placement = outside_namespace
# Einstellungen für neue Zeilen
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
csharp_style_allow_embedded_statements_on_same_line_experimental = true
#### C#-Formatierungsregeln ####
# Einstellungen für neue Zeilen
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
# Einstellungen für Einrückung
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# Einstellungen für Abstände
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
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_empty_square_brackets = 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_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# Umbrucheinstellungen
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### Benennungsstile ####
# Benennungsregeln
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
# Symbolspezifikationen
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 =
# Benennungsstile
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.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
[*.{cs,vb}]
dotnet_style_operator_placement_when_wrapping = beginning_of_line
end_of_line = crlf
tab_width = 4
indent_size = 4
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
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:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_namespace_match_folder = true:suggestion

View File

@ -4,8 +4,7 @@ namespace ModernWpfPlayground
{ {
public partial class ContentDialogExample public partial class ContentDialogExample
{ {
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register( public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(ContentDialogExample), new PropertyMetadata(default(string)));
"Message", typeof(string), typeof(ContentDialogExample), new PropertyMetadata(default(string)));
public string? Message public string? Message
{ {

View File

@ -0,0 +1,23 @@
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;
namespace ModernWpfPlayground;
public class DivideByHundredConverter : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (double)value / 100d;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}

View File

@ -2,12 +2,12 @@
x:Class="ModernWpfPlayground.MainWindow" x:Class="ModernWpfPlayground.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:Controls;assembly=Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
xmlns:local="clr-namespace:ModernWpfPlayground" xmlns:local="clr-namespace:ModernWpfPlayground"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.modernwpf.com/2019" xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:controls="clr-namespace:Controls;assembly=Controls"
x:Name="Window" x:Name="Window"
Title="{Binding Title}" Title="{Binding Title}"
Width="{Binding WindowWidth, Mode=TwoWay}" Width="{Binding WindowWidth, Mode=TwoWay}"
@ -27,7 +27,11 @@
<KeyBinding Key="S" Modifiers="Control" /> <KeyBinding Key="S" Modifiers="Control" />
<KeyBinding Key="N" Modifiers="Control" /> <KeyBinding Key="N" Modifiers="Control" />
</Window.InputBindings> </Window.InputBindings>
<Window.Resources>
<ResourceDictionary>
<ScaleTransform x:Key="ZoomSliderScaleTransform" ScaleX="{Binding Value, ElementName=ZoomSlider, Converter={local:DivideByHundredConverter}}" ScaleY="{Binding Value, ElementName=ZoomSlider, Converter={local:DivideByHundredConverter}}" />
</ResourceDictionary>
</Window.Resources>
<DockPanel> <DockPanel>
<!-- TitleBar --> <!-- TitleBar -->
<Grid <Grid
@ -49,6 +53,9 @@
<ColumnDefinition Width="{Binding ElementName=Window, Path=(ui:TitleBar.SystemOverlayLeftInset), Converter={local:PixelsToGridLengthConverter}}" /> <ColumnDefinition Width="{Binding ElementName=Window, Path=(ui:TitleBar.SystemOverlayLeftInset), Converter={local:PixelsToGridLengthConverter}}" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="{Binding ElementName=Window, Path=(ui:TitleBar.SystemOverlayRightInset), Converter={local:PixelsToGridLengthConverter}}" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Menu <Menu
Grid.Column="1" Grid.Column="1"
@ -100,12 +107,31 @@
VerticalAlignment="Center" VerticalAlignment="Center"
FontSize="13" FontSize="13"
Text="{Binding ElementName=Window, Path=Title}" /> Text="{Binding ElementName=Window, Path=Title}" />
<Slider
x:Name="ZoomSlider"
Grid.Column="3"
Width="150"
AutoToolTipPlacement="TopLeft"
Interval="1"
IsSnapToTickEnabled="True"
Maximum="200"
Minimum="50"
TickFrequency="10"
TickPlacement="BottomRight"
WindowChrome.IsHitTestVisibleInChrome="True"
Value="100" />
<MenuItem
Grid.Column="4"
Click="MenuItem_OnClick"
Header="Reset"
WindowChrome.IsHitTestVisibleInChrome="True" />
</Grid> </Grid>
<!-- Footer --> <!-- Footer -->
<Grid <Grid
Height="24" Height="24"
Background="{DynamicResource SystemControlBackgroundAccentBrush}" Background="{DynamicResource SystemControlBackgroundAccentBrush}"
DockPanel.Dock="Bottom"> DockPanel.Dock="Bottom"
LayoutTransform="{StaticResource ZoomSliderScaleTransform}">
<Grid.Resources> <Grid.Resources>
<Style TargetType="TextBlock"> <Style TargetType="TextBlock">
<Setter Property="Foreground" Value="White" /> <Setter Property="Foreground" Value="White" />
@ -127,7 +153,7 @@
HorizontalAlignment="Right" HorizontalAlignment="Right"
Text="BlaBlaBla" /> Text="BlaBlaBla" />
</Grid> </Grid>
<Grid Row="1"> <Grid LayoutTransform="{StaticResource ZoomSliderScaleTransform}" Row="1">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="40" /> <ColumnDefinition Width="40" />
<ColumnDefinition /> <ColumnDefinition />
@ -197,7 +223,7 @@
</Grid> </Grid>
</ui:SplitView.Pane> </ui:SplitView.Pane>
<!-- Content --> <!-- Content -->
<TabControl> <TabControl LayoutTransform="{StaticResource ZoomSliderScaleTransform}">
<TabItem Header="Bolt"> <TabItem Header="Bolt">
<ScrollViewer ui:ScrollViewerHelper.AutoHideScrollBars="True"> <ScrollViewer ui:ScrollViewerHelper.AutoHideScrollBars="True">
<Grid> <Grid>
@ -219,16 +245,9 @@
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>
<TabItem <TabItem Header="General" IsSelected="True">
Header="General"
IsSelected="True">
<ScrollViewer ui:ScrollViewerHelper.AutoHideScrollBars="True"> <ScrollViewer ui:ScrollViewerHelper.AutoHideScrollBars="True">
<ui:SimpleStackPanel Margin="5" Spacing="10"> <ui:SimpleStackPanel Margin="5" Spacing="10">
<ComboBox
DisplayMemberPath="Key"
ItemsSource="{Binding ThemeMode, Converter={controls:EnumToItemSourceConverter}}"
SelectedValue="{Binding ThemeMode}"
SelectedValuePath="Value" />
<controls:PropertyPresenter Label="Theme Mode" Value="{Binding ThemeMode}" /> <controls:PropertyPresenter Label="Theme Mode" Value="{Binding ThemeMode}" />
<controls:PropertyPresenter Label="Accent color" Value="{Binding AccentColors}" /> <controls:PropertyPresenter Label="Accent color" Value="{Binding AccentColors}" />
<controls:PropertyPresenter <controls:PropertyPresenter

View File

@ -1,4 +1,7 @@
namespace ModernWpfPlayground using System.Windows;
using System.Windows.Controls.Primitives;
namespace ModernWpfPlayground
{ {
/// <summary> /// <summary>
/// Interaction logic for MainWindow.xaml /// Interaction logic for MainWindow.xaml
@ -9,5 +12,10 @@
{ {
InitializeComponent(); InitializeComponent();
} }
private void MenuItem_OnClick(object sender, RoutedEventArgs e)
{
ZoomSlider.Value = 100;
}
} }
} }

View File

@ -1,62 +1,82 @@
using System.Windows; using System.Windows;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using ModernWpfPlayground.Types; using ModernWpfPlayground.Types;
using MvvmGen;
using static ModernWpf.ThemeManager; using static ModernWpf.ThemeManager;
namespace ModernWpfPlayground namespace ModernWpfPlayground
{ {
// ReSharper disable once ClassNeverInstantiated.Global // ReSharper disable once ClassNeverInstantiated.Global
[ViewModel] public partial class MainWindowViewModel : ObservableObject
public partial class MainWindowViewModel
{ {
private const string AppName = "TaBEA 3.0.0"; private const string AppName = "TaBEA 3.0.0";
[Property, PropertyCallMethod(nameof(SetTitle))] [ObservableProperty]
private string? _path; private string? _path;
[Property] private string _title = AppName; [ObservableProperty]
private string _title = AppName;
[Property, PropertyCallMethod(nameof(BooleanValue_OnChanged))] [ObservableProperty]
private bool _booleanValue = true; private bool _booleanValue = true;
[Property] private Visibility _visibilityEnumTest = Visibility.Visible; [ObservableProperty]
[Property] private double _sliderTest = 100; private Visibility _visibilityEnumTest = Visibility.Visible;
[Property] private double _validationTest;
[Property] private string? _welcomeMessage = "Shadow of the empire";
[Property, PropertyCallMethod(nameof(SetTheme))] [ObservableProperty]
private double _sliderTest = 100;
[ObservableProperty]
private double _validationTest;
[ObservableProperty]
private string? _welcomeMessage = "Shadow of the empire";
[ObservableProperty]
private ThemeMode _themeMode = ThemeMode.UseSystemSetting; private ThemeMode _themeMode = ThemeMode.UseSystemSetting;
[Property, PropertyCallMethod(nameof(SetAccentColor))] [ObservableProperty]
private AccentColors _accentColors = AccentColors.Green; private AccentColors _accentColors = AccentColors.Green;
[Property] private int _windowWidth = 1200; [ObservableProperty]
[Property] private int _windowHeight = 600; private int _windowWidth = 1200;
[Property] private bool _isPaneOpen = true;
[ObservableProperty]
private int _windowHeight = 600;
[Command] [ObservableProperty]
private void ShowNotification() private bool _isPaneOpen = true;
partial void OnBooleanValueChanged(bool value)
{ {
VisibilityEnumTest = value ? Visibility.Visible : Visibility.Collapsed;
} }
[Command] partial void OnPathChanged(string? value)
{
Title = value != null ? $"{System.IO.Path.GetFileName(value)} - {AppName}" : AppName;
}
[RelayCommand]
private void ShowNotification() { }
[RelayCommand]
private void Close() private void Close()
{ {
Application.Current.MainWindow?.Close(); Application.Current.MainWindow?.Close();
} }
private void SetTitle() partial void OnThemeModeChanged(ThemeMode value)
{ {
Title = Path != null ? $"{System.IO.Path.GetFileName(Path)} - {AppName}" : AppName; Current.ApplicationTheme = value.ToApplicationTheme();
} }
private void SetAccentColor() => Current.AccentColor = AccentColors.ToWindowsColor(); partial void OnAccentColorsChanged(AccentColors value)
{
Current.AccentColor = value.ToWindowsColor();
}
[RelayCommand]
private void SetTheme() => Current.ApplicationTheme = ThemeMode.ToApplicationTheme();
[Command]
private async void ShowDialog() private async void ShowDialog()
{ {
var dialog = new ContentDialogExample { Message = WelcomeMessage }; var dialog = new ContentDialogExample { Message = WelcomeMessage };
@ -64,12 +84,7 @@ namespace ModernWpfPlayground
WelcomeMessage = result.ToString(); WelcomeMessage = result.ToString();
} }
private void BooleanValue_OnChanged() [RelayCommand]
{
VisibilityEnumTest = BooleanValue ? Visibility.Visible : Visibility.Collapsed;
}
[Command]
private void SaveViewModel() private void SaveViewModel()
{ {
// var contents = _serializer.Serialize(Values); // var contents = _serializer.Serialize(Values);

View File

@ -2,7 +2,8 @@
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net7.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
</PropertyGroup> </PropertyGroup>
@ -12,11 +13,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.1.0-preview1" />
<PackageReference Include="FastMember" Version="1.5.0" /> <PackageReference Include="FastMember" Version="1.5.0" />
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" /> <PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
<PackageReference Include="ModernWpfUis" Version="1.2.0" /> <PackageReference Include="ModernWpfUI" Version="0.9.7-preview.2" />
<PackageReference Include="MvvmGen" Version="1.1.2" /> <PackageReference Include="YamlDotNet" Version="12.0.2" />
<PackageReference Include="YamlDotNet" Version="11.2.1" />
<PackageReference Include="MahApps.Metro.IconPacks.FontAwesome" Version="4.11.0" /> <PackageReference Include="MahApps.Metro.IconPacks.FontAwesome" Version="4.11.0" />
</ItemGroup> </ItemGroup>

View File

@ -1,5 +1,4 @@
using System; using System.Globalization;
using System.Globalization;
using System.Windows; using System.Windows;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Markup; using System.Windows.Markup;
@ -20,7 +19,6 @@ namespace ModernWpfPlayground
throw new NotImplementedException(); throw new NotImplementedException();
} }
public override object ProvideValue(IServiceProvider serviceProvider) => public override object ProvideValue(IServiceProvider serviceProvider) => _converter ??= new PixelsToGridLengthConverter();
_converter ??= new PixelsToGridLengthConverter();
} }
} }

View File

@ -1,8 +1,7 @@
using System; using System.Windows.Media;
using System.Windows.Media;
namespace ModernWpfPlayground.Types;
namespace ModernWpfPlayground.Types
{
public enum AccentColors public enum AccentColors
{ {
Green, Green,
@ -27,4 +26,3 @@ namespace ModernWpfPlayground.Types
}; };
} }
} }
}

View File

@ -1,14 +1,18 @@
using System; using System.ComponentModel;
using System.ComponentModel;
using ModernWpf; using ModernWpf;
namespace ModernWpfPlayground.Types namespace ModernWpfPlayground.Types
{ {
public enum ThemeMode public enum ThemeMode
{ {
[Description("Light")] Light, [Description("Light")]
[Description("Dark")] Dark, Light,
[Description("Use system setting")] UseSystemSetting
[Description("Dark")]
Dark,
[Description("Use system setting")]
UseSystemSetting
} }
public static class ThemeModeExtension public static class ThemeModeExtension

View File

@ -1,7 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net7.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
</PropertyGroup> </PropertyGroup>
@ -13,7 +14,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Drawing.Common" Version="6.0.0" /> <PackageReference Include="System.Drawing.Common" Version="7.0.0" />
</ItemGroup> </ItemGroup>

View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=propertypresenter/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -1,13 +1,10 @@
using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Markup; using System.Windows.Markup;
namespace Controls namespace Controls;
{
/// <summary> /// <summary>
/// Converts enums to a List with KeyValuePairs. /// Converts enums to a List with KeyValuePairs.
/// </summary> /// </summary>
@ -17,9 +14,9 @@ namespace Controls
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
if (value is not Enum) return Binding.DoNothing; if (value is not Enum)
return (from object enumValue in Enum.GetValues(value.GetType()) return Binding.DoNothing;
select new KeyValuePair<string, object>(GetDescription(enumValue), enumValue)).ToList(); return (from object enumValue in Enum.GetValues(value.GetType()) select new KeyValuePair<string, object>(GetDescription(enumValue), enumValue)).ToList();
} }
/// <summary> /// <summary>
@ -29,12 +26,9 @@ namespace Controls
/// <returns></returns> /// <returns></returns>
private static string GetDescription(object value) private static string GetDescription(object value)
{ {
if (value is not Enum enumValue) return string.Empty; if (value is not Enum enumValue)
var descriptionAttribute = enumValue.GetType() return string.Empty;
.GetField(enumValue.ToString())? var descriptionAttribute = enumValue.GetType().GetField(enumValue.ToString())?.GetCustomAttributes(false).OfType<DescriptionAttribute>().FirstOrDefault();
.GetCustomAttributes(false)
.OfType<DescriptionAttribute>()
.FirstOrDefault();
return descriptionAttribute?.Description ?? value.ToString() ?? string.Empty; return descriptionAttribute?.Description ?? value.ToString() ?? string.Empty;
} }
@ -46,4 +40,3 @@ namespace Controls
public override object ProvideValue(IServiceProvider serviceProvider) => _converter ??= new EnumToItemSourceConverter(); public override object ProvideValue(IServiceProvider serviceProvider) => _converter ??= new EnumToItemSourceConverter();
} }
}

View File

@ -2,8 +2,8 @@
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Markup; using System.Windows.Markup;
namespace Controls namespace Controls;
{
/// <summary> /// <summary>
/// Interaction logic for <see cref="MagicSymbolControl"/> /// Interaction logic for <see cref="MagicSymbolControl"/>
/// </summary> /// </summary>
@ -13,7 +13,12 @@ namespace Controls
/// <summary> /// <summary>
/// Dependency property for <see cref="Symbol"/> property /// Dependency property for <see cref="Symbol"/> property
/// </summary> /// </summary>
public static readonly DependencyProperty SymbolProperty = DependencyProperty.Register(nameof(Symbol), typeof(object), typeof(MagicSymbolControl), new PropertyMetadata(default, PropertyChangedCallback)); public static readonly DependencyProperty SymbolProperty = DependencyProperty.Register(
nameof(Symbol),
typeof(object),
typeof(MagicSymbolControl),
new PropertyMetadata(default, PropertyChangedCallback)
);
private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{ {
@ -40,4 +45,3 @@ namespace Controls
Focusable = false; Focusable = false;
} }
} }
}

View File

@ -1,6 +1,4 @@
using System; using System.Globalization;
using System.Collections.Generic;
using System.Globalization;
using System.Text; using System.Text;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
@ -8,8 +6,8 @@ using System.Windows.Data;
using System.Windows.Documents; using System.Windows.Documents;
using System.Windows.Media; using System.Windows.Media;
namespace Controls namespace Controls;
{
/// <summary> /// <summary>
/// Magically converts a text to /// Magically converts a text to
/// </summary> /// </summary>
@ -34,9 +32,11 @@ namespace Controls
public static object ConvertToFrameworkElement(object value) public static object ConvertToFrameworkElement(object value)
{ {
var data = value as string; var data = value as string;
if (string.IsNullOrWhiteSpace(data)) return value; //maybe not a string. eventually something else. if (string.IsNullOrWhiteSpace(data))
return value; //maybe not a string. eventually something else.
if (data.StartsWith(NoParseKeyword, StringComparison.Ordinal)) return data[NoParseKeyword.Length..]; if (data.StartsWith(NoParseKeyword, StringComparison.Ordinal))
return data[NoParseKeyword.Length..];
if (data.StartsWith(PathKeyword, StringComparison.Ordinal)) if (data.StartsWith(PathKeyword, StringComparison.Ordinal))
{ {
@ -113,9 +113,7 @@ namespace Controls
snippet.Clear(); snippet.Clear();
} }
alignment = alignment == BaselineAlignment.Subscript alignment = alignment == BaselineAlignment.Subscript ? BaselineAlignment.Baseline : BaselineAlignment.Subscript;
? BaselineAlignment.Baseline
: BaselineAlignment.Subscript;
break; break;
case '^': case '^':
if (snippet.Length > 0) if (snippet.Length > 0)
@ -125,9 +123,7 @@ namespace Controls
snippet.Clear(); snippet.Clear();
} }
alignment = alignment == BaselineAlignment.Superscript alignment = alignment == BaselineAlignment.Superscript ? BaselineAlignment.Baseline : BaselineAlignment.Superscript;
? BaselineAlignment.Baseline
: BaselineAlignment.Superscript;
break; break;
default: default:
snippet.Append(c); snippet.Append(c);
@ -146,7 +142,5 @@ namespace Controls
} }
/// <inheritdoc /> /// <inheritdoc />
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => Binding.DoNothing;
=> Binding.DoNothing;
}
} }

View File

@ -1,9 +1,8 @@
using System; using System.Windows;
using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
namespace Controls namespace Controls;
{
/// <summary> /// <summary>
/// Selects the right template on base of value-type. /// Selects the right template on base of value-type.
/// </summary> /// </summary>
@ -36,4 +35,3 @@ namespace Controls
}; };
} }
} }
}

View File

@ -15,6 +15,7 @@
</Validation.ErrorTemplate> </Validation.ErrorTemplate>
<ContentControl.Resources> <ContentControl.Resources>
<DataTemplate x:Key="DefaultDataTemplate"> <DataTemplate x:Key="DefaultDataTemplate">
<Grid>
<Grid> <Grid>
<controls:TextBoxEx <controls:TextBoxEx
x:Name="InputTextBox" x:Name="InputTextBox"
@ -39,6 +40,13 @@
</Style> </Style>
</TextBox.Style> </TextBox.Style>
</controls:TextBoxEx> </controls:TextBoxEx>
<controls:MagicSymbolControl
x:Name="PartSymbol"
Margin="5,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Symbol="{Binding Symbol, ElementName=LayoutRoot}" />
</Grid>
<TextBlock <TextBlock
Margin="6,0,0,0" Margin="6,0,0,0"
Padding="2,2,2,2" Padding="2,2,2,2"
@ -152,13 +160,6 @@
VerticalAlignment="Center" VerticalAlignment="Center"
Focusable="False" Focusable="False"
Text="{Binding Label, ElementName=LayoutRoot}" /> Text="{Binding Label, ElementName=LayoutRoot}" />
<controls:MagicSymbolControl
x:Name="PartSymbol"
Grid.Column="2"
Margin="5,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Symbol="{Binding Symbol, ElementName=LayoutRoot}" />
</Grid> </Grid>
<DockPanel Grid.Column="1"> <DockPanel Grid.Column="1">
<Button <Button

View File

@ -3,8 +3,8 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Markup; using System.Windows.Markup;
namespace Controls namespace Controls;
{
/// <inheritdoc cref="ContentControl" /> /// <inheritdoc cref="ContentControl" />
/// <summary> /// <summary>
/// Interaction logic for PropertyPresenter.xaml /// Interaction logic for PropertyPresenter.xaml
@ -25,7 +25,12 @@ namespace Controls
/// <summary> /// <summary>
/// Command Parameter property /// Command Parameter property
/// </summary> /// </summary>
public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(nameof(CommandParameter), typeof(object), typeof(PropertyPresenter), new PropertyMetadata(default(object))); public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(
nameof(CommandParameter),
typeof(object),
typeof(PropertyPresenter),
new PropertyMetadata(default(object))
);
/// <summary> /// <summary>
/// Command property /// Command property
@ -35,7 +40,12 @@ namespace Controls
/// <summary> /// <summary>
/// is checked property. /// is checked property.
/// </summary> /// </summary>
public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(nameof(IsChecked), typeof(bool?), typeof(PropertyPresenter), new FrameworkPropertyMetadata(default(bool?), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
nameof(IsChecked),
typeof(bool?),
typeof(PropertyPresenter),
new FrameworkPropertyMetadata(default(bool?), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
/// <summary> /// <summary>
/// Is readonly property /// Is readonly property
@ -60,12 +70,22 @@ namespace Controls
/// <summary> /// <summary>
/// Value Property /// Value Property
/// </summary> /// </summary>
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(nameof(Value), typeof(object), typeof(PropertyPresenter), new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
nameof(Value),
typeof(object),
typeof(PropertyPresenter),
new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
/// <summary> /// <summary>
/// Watermark Property /// Watermark Property
/// </summary> /// </summary>
public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register(nameof(Watermark), typeof(string), typeof(PropertyPresenter), new FrameworkPropertyMetadata(default(string))); public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register(
nameof(Watermark),
typeof(string),
typeof(PropertyPresenter),
new FrameworkPropertyMetadata(default(string))
);
/// <inheritdoc /> /// <inheritdoc />
public PropertyPresenter() public PropertyPresenter()
@ -178,4 +198,3 @@ namespace Controls
return $"{base.ToString()} {Value}"; return $"{base.ToString()} {Value}";
} }
} }
}

View File

@ -2,8 +2,8 @@
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
namespace Controls namespace Controls;
{
/// <inheritdoc /> /// <inheritdoc />
/// <summary> /// <summary>
/// Represents a TextBox that can update the binding on enter. /// Represents a TextBox that can update the binding on enter.
@ -13,28 +13,22 @@ namespace Controls
/// <summary> /// <summary>
/// Identifies the <see cref="MoveFocusOnEnter"/> dependency property. /// Identifies the <see cref="MoveFocusOnEnter"/> dependency property.
/// </summary> /// </summary>
public static readonly DependencyProperty MoveFocusOnEnterProperty = public static readonly DependencyProperty MoveFocusOnEnterProperty = DependencyProperty.Register(nameof(MoveFocusOnEnter), typeof(bool), typeof(TextBoxEx), new UIPropertyMetadata(true));
DependencyProperty.Register(
"MoveFocusOnEnter", typeof(bool), typeof(TextBoxEx), new UIPropertyMetadata(true));
/// <summary> /// <summary>
/// Identifies the <see cref="UpdateBindingOnEnter"/> dependency property. /// Identifies the <see cref="UpdateBindingOnEnter"/> dependency property.
/// </summary> /// </summary>
public static readonly DependencyProperty UpdateBindingOnEnterProperty = public static readonly DependencyProperty UpdateBindingOnEnterProperty = DependencyProperty.Register(nameof(UpdateBindingOnEnter), typeof(bool), typeof(TextBoxEx), new UIPropertyMetadata(true));
DependencyProperty.Register(
"UpdateBindingOnEnter", typeof(bool), typeof(TextBoxEx), new UIPropertyMetadata(true));
/// <summary> /// <summary>
/// Identifies the <see cref="ScrollToHomeOnFocus"/> dependency property. /// Identifies the <see cref="ScrollToHomeOnFocus"/> dependency property.
/// </summary> /// </summary>
public static readonly DependencyProperty ScrollToHomeOnFocusProperty = public static readonly DependencyProperty ScrollToHomeOnFocusProperty = DependencyProperty.Register(nameof(ScrollToHomeOnFocus), typeof(bool), typeof(TextBoxEx), new PropertyMetadata(true));
DependencyProperty.Register("ScrollToHomeOnFocus", typeof(bool), typeof(TextBoxEx), new PropertyMetadata(true));
/// <summary> /// <summary>
/// Identifies the <see cref="SelectAllOnFocus"/> dependency property. /// Identifies the <see cref="SelectAllOnFocus"/> dependency property.
/// </summary> /// </summary>
public static readonly DependencyProperty SelectAllOnFocusProperty = public static readonly DependencyProperty SelectAllOnFocusProperty = DependencyProperty.Register(nameof(SelectAllOnFocus), typeof(bool), typeof(TextBoxEx), new PropertyMetadata(true));
DependencyProperty.Register("SelectAllOnFocus", typeof(bool), typeof(TextBoxEx), new PropertyMetadata(true));
/// <inheritdoc /> /// <inheritdoc />
/// <summary> /// <summary>
@ -75,7 +69,6 @@ namespace Controls
public bool MoveFocusOnEnter public bool MoveFocusOnEnter
{ {
get => (bool)GetValue(MoveFocusOnEnterProperty); get => (bool)GetValue(MoveFocusOnEnterProperty);
set => SetValue(MoveFocusOnEnterProperty, value); set => SetValue(MoveFocusOnEnterProperty, value);
} }
@ -85,7 +78,6 @@ namespace Controls
public bool UpdateBindingOnEnter public bool UpdateBindingOnEnter
{ {
get => (bool)GetValue(UpdateBindingOnEnterProperty); get => (bool)GetValue(UpdateBindingOnEnterProperty);
set => SetValue(UpdateBindingOnEnterProperty, value); set => SetValue(UpdateBindingOnEnterProperty, value);
} }
@ -162,4 +154,3 @@ namespace Controls
e.Handled = true; e.Handled = true;
} }
} }
}

View File

@ -1,7 +1,7 @@
using System.Windows; using System.Windows;
namespace Controls namespace Controls;
{
/// <summary> /// <summary>
/// A component of the symbol /// A component of the symbol
/// </summary> /// </summary>
@ -28,4 +28,3 @@ namespace Controls
/// </summary> /// </summary>
public readonly BaselineAlignment Style; public readonly BaselineAlignment Style;
} }
}

View File

@ -1,5 +1,4 @@
using System; using System.Drawing;
using System.Drawing;
using System.Globalization; using System.Globalization;
using System.Net; using System.Net;
using System.Windows; using System.Windows;
@ -11,8 +10,8 @@ using Brushes = System.Windows.Media.Brushes;
using FontFamily = System.Windows.Media.FontFamily; using FontFamily = System.Windows.Media.FontFamily;
using Point = System.Windows.Point; using Point = System.Windows.Point;
namespace Controls namespace Controls;
{
/// <summary> /// <summary>
/// Makes an Bitmap from every Imageformat. /// Makes an Bitmap from every Imageformat.
/// </summary> /// </summary>
@ -26,7 +25,8 @@ namespace Controls
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(16, 16)); return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(16, 16));
} }
if (value is not string strValue) return Binding.DoNothing; if (value is not string strValue)
return Binding.DoNothing;
if (strValue.StartsWith(dynResPrefix, StringComparison.Ordinal)) if (strValue.StartsWith(dynResPrefix, StringComparison.Ordinal))
{ {
var resource = Application.Current.TryFindResource(strValue.Replace(dynResPrefix, string.Empty, StringComparison.InvariantCulture)); var resource = Application.Current.TryFindResource(strValue.Replace(dynResPrefix, string.Empty, StringComparison.InvariantCulture));
@ -42,8 +42,7 @@ namespace Controls
return GetIcon(Geometry.Parse(strValue), null); return GetIcon(Geometry.Parse(strValue), null);
} }
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => Binding.DoNothing;
Binding.DoNothing;
/// <summary> /// <summary>
/// Get icon a ImageSource from geometry. /// Get icon a ImageSource from geometry.
@ -69,15 +68,15 @@ namespace Controls
public static ImageSource DrawText(string text, string strFontFamily, Brush brush) public static ImageSource DrawText(string text, string strFontFamily, Brush brush)
{ {
var fontFamily = new FontFamily(strFontFamily); var fontFamily = new FontFamily(strFontFamily);
var formattedText = new FormattedText(text, var formattedText = new FormattedText(
text,
CultureInfo.GetCultureInfo("en-us"), CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight, FlowDirection.LeftToRight,
new Typeface( new Typeface(fontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal),
fontFamily, 64,
FontStyles.Normal, brush,
FontWeights.Normal, 1.5
FontStretches.Normal), );
64, brush, 1.5);
var geometry = formattedText.BuildGeometry(new Point(0, 0)); var geometry = formattedText.BuildGeometry(new Point(0, 0));
return GetIcon(geometry, null); return GetIcon(geometry, null);
@ -91,10 +90,8 @@ namespace Controls
public class InverseBooleanConverter : IValueConverter public class InverseBooleanConverter : IValueConverter
{ {
/// <inheritdoc /> /// <inheritdoc />
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => value is bool b ? !b : throw new InvalidOperationException("The target must be a boolean");
value is bool b ? !b : throw new InvalidOperationException("The target must be a boolean");
/// <inheritdoc /> /// <inheritdoc />
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => Binding.DoNothing; public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => Binding.DoNothing;
} }
}