Compare commits

..

3 Commits

Author SHA1 Message Date
Zhang Dian
e0d7a46e50 chore: stretch the combo box. 2026-04-15 01:28:27 +08:00
Zhang Dian
d1b862ef85 chore: x:Name->Name. 2026-04-15 01:23:54 +08:00
Zhang Dian
0e9dbdd528 feat: add page & modal transitions to NavigationPage. 2026-04-14 23:39:41 +08:00
45 changed files with 823 additions and 1027 deletions

View File

@@ -1,240 +0,0 @@
# editorconfig.org
# top-most EditorConfig file
root = true
# Default settings:
# A newline ending every file
# Use 4 spaces as indentation
[*]
insert_final_newline = true
indent_style = space
indent_size = 4
# C# files
[*.cs]
# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = 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
# trim_trailing_whitespace = true
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = one_less_than_current
# avoid this. unless absolutely necessary
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
# prefer var
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
csharp_style_var_elsewhere = true:suggestion
# use language keywords instead of BCL types
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# name all constant fields using PascalCase
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
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.required_modifiers = const
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# private static fields should have s_ prefix
dotnet_naming_rule.private_static_fields_should_have_prefix.severity = suggestion
dotnet_naming_rule.private_static_fields_should_have_prefix.symbols = private_static_fields
dotnet_naming_rule.private_static_fields_should_have_prefix.style = private_static_prefix_style
dotnet_naming_symbols.private_static_fields.applicable_kinds = field
dotnet_naming_symbols.private_static_fields.required_modifiers = static
dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private
dotnet_naming_style.private_static_prefix_style.required_prefix = s_
dotnet_naming_style.private_static_prefix_style.capitalization = camel_case
# internal and private fields should be _camelCase
dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
dotnet_naming_style.camel_case_underscore_style.required_prefix = _
dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case
# use accessibility modifiers
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
# Code style defaults
dotnet_sort_system_directives_first = true
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false
# Expression-level preferences
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods = false:none
csharp_style_expression_bodied_constructors = false:none
csharp_style_expression_bodied_operators = false:none
csharp_style_expression_bodied_properties = true:none
csharp_style_expression_bodied_indexers = true:none
csharp_style_expression_bodied_accessors = true:none
# Pattern matching
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
# Null checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Space preferences
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
space_within_single_line_array_initializer_braces = true
#Net Analyzer
dotnet_analyzer_diagnostic.category-Performance.severity = none #error - Uncomment when all violations are fixed.
# CA1018: Mark attributes with AttributeUsageAttribute
dotnet_diagnostic.CA1018.severity = warning
# CA1304: Specify CultureInfo
dotnet_diagnostic.CA1304.severity = warning
# CA1802: Use literals where appropriate
dotnet_diagnostic.CA1802.severity = warning
# CA1813: Avoid unsealed attributes
dotnet_diagnostic.CA1813.severity = warning
# CA1815: Override equals and operator equals on value types
dotnet_diagnostic.CA1815.severity = warning
# CA1820: Test for empty strings using string length
dotnet_diagnostic.CA1820.severity = warning
# CA1821: Remove empty finalizers
dotnet_diagnostic.CA1821.severity = warning
# CA1822: Mark members as static
dotnet_diagnostic.CA1822.severity = suggestion
dotnet_code_quality.CA1822.api_surface = private, internal
# CA1823: Avoid unused private fields
dotnet_diagnostic.CA1823.severity = warning
# CA1825: Avoid zero-length array allocations
dotnet_diagnostic.CA1825.severity = warning
# CA1826: Use property instead of Linq Enumerable method
dotnet_diagnostic.CA1826.severity = suggestion
# CA1827: Do not use Count/LongCount when Any can be used
dotnet_diagnostic.CA1827.severity = warning
# CA1828: Do not use CountAsync/LongCountAsync when AnyAsync can be used
dotnet_diagnostic.CA1828.severity = warning
# CA1829: Use Length/Count property instead of Enumerable.Count method
dotnet_diagnostic.CA1829.severity = warning
#CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = warning
# CA1851: Possible multiple enumerations of IEnumerable collection
dotnet_diagnostic.CA1851.severity = warning
#CA1854: Prefer the IDictionary.TryGetValue(TKey, out TValue) method
dotnet_diagnostic.CA1854.severity = warning
#CA2211:Non-constant fields should not be visible
dotnet_diagnostic.CA2211.severity = warning
# Wrapping preferences
csharp_wrap_before_ternary_opsigns = false
# Avalonia PublicAnalyzer preferences
dotnet_diagnostic.AVP1000.severity = warning
dotnet_diagnostic.AVP1001.severity = warning
dotnet_diagnostic.AVP1002.severity = warning
dotnet_diagnostic.AVP1010.severity = warning
dotnet_diagnostic.AVP1011.severity = warning
dotnet_diagnostic.AVP1012.severity = warning
dotnet_diagnostic.AVP1013.severity = warning
dotnet_diagnostic.AVP1020.severity = warning
dotnet_diagnostic.AVP1021.severity = warning
dotnet_diagnostic.AVP1022.severity = warning
dotnet_diagnostic.AVP1030.severity = warning
dotnet_diagnostic.AVP1031.severity = warning
dotnet_diagnostic.AVP1032.severity = warning
dotnet_diagnostic.AVP1040.severity = warning
dotnet_diagnostic.AVA2001.severity = warning
# Xaml files
[*.{xaml,axaml}]
indent_size = 4
# DuplicateSetterError
avalonia_xaml_diagnostic.AVLN2203.severity = warning
# StyleInMergedDictionaries
avalonia_xaml_diagnostic.AVLN2204.severity = warning
# RequiredTemplatePartMissing
avalonia_xaml_diagnostic.AVLN2205.severity = warning
# OptionalTemplatePartMissing
avalonia_xaml_diagnostic.AVLN2206.severity = info
# TemplatePartWrongType
avalonia_xaml_diagnostic.AVLN2207.severity = warning
# ItemContainerInsideTemplate
avalonia_xaml_diagnostic.AVLN2208.severity = warning
# Obsolete
avalonia_xaml_diagnostic.AVLN5001.severity = warning
# Xml project files
[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
indent_size = 2
# Xml build files
[*.builds]
indent_size = 2
# Xml files
[*.{xml,stylecop,resx,ruleset}]
indent_size = 2
# Xml config files
[*.{props,targets,config,nuspec}]
indent_size = 2
[*.json]
indent_size = 2
# Shell scripts
[*.sh]
end_of_line = lf
[*.{cmd,bat}]
end_of_line = crlf

View File

@@ -1,92 +0,0 @@
# Git Commit Message Convention
This project follows the [Conventional Commits](https://www.conventionalcommits.org/) specification for commit messages.
## Format
```
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
```
## Types
| Type | Description |
|------|-------------|
| `feat` | A new feature |
| `fix` | A bug fix |
| `docs` | Documentation only changes |
| `style` | Changes that do not affect the meaning of the code (formatting, missing semicolons, etc.) |
| `refactor` | A code change that neither fixes a bug nor adds a feature |
| `perf` | A code change that improves performance |
| `test` | Adding missing tests or correcting existing tests |
| `build` | Changes that affect the build system or external dependencies |
| `ci` | Changes to CI configuration files and scripts |
| `chore` | Other changes that don't modify source or test files |
| `revert` | Reverts a previous commit |
## Rules
1. **Limit the subject line to 50 characters** (72 character hard limit)
2. **Use the imperative mood** in the subject line (e.g., "add feature" not "added feature")
3. **Do not end the subject line with a period**
4. **Use lowercase** for the description (e.g., "add feature" not "Add feature")
5. **Separate subject from body with a blank line**
6. **Wrap the body at 72 characters**
7. **Use the body to explain what and why**, not how
8. **Reference issues and pull requests** in the footer
## Scope
The scope should be the name of the package or area affected (e.g., `button`, `datepicker`, `theme`, `demo`).
## Examples
### Simple commit
```
feat(button): add loading state support
```
### Commit with body
```
fix(datepicker): correct month navigation overflow
When navigating past December, the month index wrapped to a
negative value instead of rolling over to January of the next year.
```
### Commit with breaking change
```
feat(theme)!: rename SemiColorPrimary to SemiColorBrand
BREAKING CHANGE: The token SemiColorPrimary has been renamed to
SemiColorBrand. Update all references in your custom theme files.
```
### Commit referencing an issue
```
fix(textbox): placeholder not visible in dark mode
Closes #123
```
## Breaking Changes
Breaking changes must be indicated by appending a `!` after the type/scope, or by including a `BREAKING CHANGE:` footer. Both methods may be used together.
## Revert Commits
When reverting a previous commit, use the `revert` type and reference the reverted commit SHA in the footer:
```
revert: feat(button): add loading state support
Revert commit a1b2c3d.
```

View File

@@ -63,7 +63,7 @@ jobs:
run: ls -R run: ls -R
- name: Release - name: Release
uses: softprops/action-gh-release@v3 uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch'
with: with:
generate_release_notes: true generate_release_notes: true

View File

@@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<AvaloniaVersion>12.0.1</AvaloniaVersion> <AvaloniaVersion>12.0.0</AvaloniaVersion>
<DataGridVersion>12.0.0</DataGridVersion> <DataGridVersion>12.0.0</DataGridVersion>
<SkiaSharpVersion>3.119.3-preview.1.1</SkiaSharpVersion> <SkiaSharpVersion>3.119.3-preview.1.1</SkiaSharpVersion>
</PropertyGroup> </PropertyGroup>

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using Avalonia;
using Avalonia.Data.Converters;
using Avalonia.Metadata;
namespace Semi.Avalonia.Demo.Converters;
public class FileIconConverter : IMultiValueConverter
{
[Content] public IDictionary<string, object?> Items { get; } = new Dictionary<string, object?>();
public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
if (values[0] is bool isDirectory && values[1] is bool isOpen)
{
if (!isDirectory)
{
return Items["file"];
}
return isOpen ? Items["folderOpen"] : Items["folderClosed"];
}
return AvaloniaProperty.UnsetValue;
}
}

View File

@@ -29,40 +29,40 @@
<AutoCompleteBox <AutoCompleteBox
PlaceholderText="Please select a State" PlaceholderText="Please select a State"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
Classes="Large" Classes="Large"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
Classes="Small" Classes="Small"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
Classes="Bordered" Classes="Bordered"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
IsEnabled="False" IsEnabled="False"
PlaceholderText="Disabled" PlaceholderText="Disabled"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
InnerLeftContent="https://" InnerLeftContent="https://"
InnerRightContent=".com" InnerRightContent=".com"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<AutoCompleteBox <AutoCompleteBox
Width="100" Width="100"
Classes="Large" Classes="Large"
PlaceholderText="Large" PlaceholderText="Large"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
Width="100" Width="100"
PlaceholderText="Default" PlaceholderText="Default"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
Width="100" Width="100"
Classes="Small" Classes="Small"
PlaceholderText="Small" PlaceholderText="Small"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
@@ -70,17 +70,17 @@
Width="100" Width="100"
IsEnabled="False" IsEnabled="False"
PlaceholderText="Disabled" PlaceholderText="Disabled"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
Width="100" Width="100"
Classes="Bordered" Classes="Bordered"
PlaceholderText="Bordered" PlaceholderText="Bordered"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
<AutoCompleteBox <AutoCompleteBox
Width="100" Width="100"
Classes="Bordered" Classes="Bordered"
IsEnabled="False" IsEnabled="False"
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" /> ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>

View File

@@ -10,84 +10,45 @@
<DockPanel> <DockPanel>
<ScrollViewer DockPanel.Dock="Right" Width="260"> <ScrollViewer DockPanel.Dock="Right" Width="260">
<StackPanel Margin="12" Spacing="8"> <StackPanel Margin="12" Spacing="8">
<TextBlock <TextBlock Text="Configuration" FontWeight="SemiBold" FontSize="16"
Theme="{DynamicResource TitleTextBlock}" Foreground="{DynamicResource SemiColorText0}" />
Classes="H4"
Text="Configuration" />
<CheckBox Name="ToggleDrawerCheck" <Button Content="Toggle Drawer"
Content="Toggle Drawer" /> HorizontalAlignment="Stretch"
Click="OnToggleDrawer" />
<Separator />
<CheckBox Name="GestureCheck" <CheckBox Name="GestureCheck"
Content="Gesture Enabled" Content="Gesture Enabled"
IsChecked="True" /> IsChecked="True"
IsCheckedChanged="OnGestureChanged" />
<TextBlock Text="Behavior" FontSize="12" /> <ComboBox SelectionChanged="OnLayoutChanged" >
<ComboBox <ComboBoxItem Content="CompactOverlay" />
Name="BehaviorComboBox" <ComboBoxItem Content="CompactInline" />
HorizontalAlignment="Stretch" <ComboBoxItem Content="Split" />
SelectedIndex="0"> <ComboBoxItem Content="Overlay" />
<DrawerBehavior>Auto</DrawerBehavior>
<DrawerBehavior>Flyout</DrawerBehavior>
<DrawerBehavior>Locked</DrawerBehavior>
<DrawerBehavior>Disabled</DrawerBehavior>
</ComboBox> </ComboBox>
<TextBlock Text="Layout" FontSize="12" /> <Separator />
<ComboBox
Name="LayoutComboBox"
HorizontalAlignment="Stretch"
SelectedIndex="0">
<DrawerLayoutBehavior>Overlay</DrawerLayoutBehavior>
<DrawerLayoutBehavior>Split</DrawerLayoutBehavior>
<DrawerLayoutBehavior>CompactOverlay</DrawerLayoutBehavior>
<DrawerLayoutBehavior>CompactInline</DrawerLayoutBehavior>
</ComboBox>
<TextBlock Text="Placement" FontSize="12" /> <TextBlock Text="Status" FontWeight="SemiBold" FontSize="14" />
<ComboBox <TextBlock Name="StatusText"
Name="PlacementComboBox" Text="Drawer: Closed"
HorizontalAlignment="Stretch" Opacity="0.7"
SelectedIndex="0"> TextWrapping="Wrap" />
<DrawerPlacement>Left</DrawerPlacement>
<DrawerPlacement>Right</DrawerPlacement>
<DrawerPlacement>Top</DrawerPlacement>
<DrawerPlacement>Bottom</DrawerPlacement>
</ComboBox>
<TextBlock Text="Compact Drawer Length" FontSize="12" />
<StackPanel Orientation="Horizontal" Spacing="8">
<Slider Name="CompactDrawerLengthSlider"
Minimum="0" Maximum="250" Value="80"
TickFrequency="1"
IsSnapToTickEnabled="True"
Width="150" />
<TextBlock Text="{Binding #CompactDrawerLengthSlider.Value}" />
</StackPanel>
<TextBlock Text="Drawer Length" FontSize="12" />
<StackPanel Orientation="Horizontal" Spacing="8">
<Slider Name="DrawerLengthSlider"
Minimum="150" Maximum="400" Value="260"
TickFrequency="1"
IsSnapToTickEnabled="True"
Width="150" />
<TextBlock Text="{Binding #DrawerLengthSlider.Value}" />
</StackPanel>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
<Border DockPanel.Dock="Right" Width="1" Background="{DynamicResource SemiColorBorder}" /> <Border DockPanel.Dock="Right" Width="1" Background="{DynamicResource SemiColorBackground0}" />
<DrawerPage Name="DemoDrawer" <DrawerPage Name="DemoDrawer"
Margin="12" Margin="12"
Header="First Look" Header="First Look"
IsOpen="{Binding #ToggleDrawerCheck.IsChecked}" DrawerLayoutBehavior="Overlay"
IsGestureEnabled="{Binding #GestureCheck.IsChecked}" CompactDrawerLength="80"
DrawerBehavior="{Binding #BehaviorComboBox.SelectedItem}" DrawerLength="250">
DrawerLayoutBehavior="{Binding #LayoutComboBox.SelectedItem}"
DrawerPlacement="{Binding #PlacementComboBox.SelectedItem}"
CompactDrawerLength="{Binding #CompactDrawerLengthSlider.Value}"
DrawerLength="{Binding #DrawerLengthSlider.Value}">
<DrawerPage.DrawerHeader> <DrawerPage.DrawerHeader>
<TextBlock Text="Menu" Margin="16" FontSize="18" FontWeight="SemiBold" Foreground="{DynamicResource SemiColorPrimary}" /> <TextBlock Text="Menu" Margin="16" FontSize="18" FontWeight="SemiBold" Foreground="{DynamicResource SemiColorPrimary}" />
</DrawerPage.DrawerHeader> </DrawerPage.DrawerHeader>

View File

@@ -1,6 +1,8 @@
using System.Linq; using System;
using System.Linq;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input.GestureRecognizers; using Avalonia.Input.GestureRecognizers;
using Avalonia.Interactivity;
using Avalonia.Layout; using Avalonia.Layout;
namespace Semi.Avalonia.Demo.Pages; namespace Semi.Avalonia.Demo.Pages;
@@ -13,6 +15,32 @@ public partial class DrawerPageDemo : UserControl
EnableMouseSwipeGesture(DemoDrawer); EnableMouseSwipeGesture(DemoDrawer);
} }
protected override void OnLoaded(RoutedEventArgs e)
{
base.OnLoaded(e);
DemoDrawer.Opened += OnDrawerStatusChanged;
DemoDrawer.Closed += OnDrawerStatusChanged;
}
protected override void OnUnloaded(RoutedEventArgs e)
{
base.OnUnloaded(e);
DemoDrawer.Opened -= OnDrawerStatusChanged;
DemoDrawer.Closed -= OnDrawerStatusChanged;
}
private void OnDrawerStatusChanged(object? sender, EventArgs e) => UpdateStatus();
private void OnToggleDrawer(object? sender, RoutedEventArgs e)
{
DemoDrawer.IsOpen = !DemoDrawer.IsOpen;
}
private void OnGestureChanged(object? sender, RoutedEventArgs e)
{
DemoDrawer.IsGestureEnabled = GestureCheck.IsChecked == true;
}
private void OnMenuSelectionChanged(object? sender, SelectionChangedEventArgs e) private void OnMenuSelectionChanged(object? sender, SelectionChangedEventArgs e)
{ {
if (DrawerMenu.SelectedItem is ListBoxItem item) if (DrawerMenu.SelectedItem is ListBoxItem item)
@@ -34,6 +62,11 @@ public partial class DrawerPageDemo : UserControl
} }
} }
private void UpdateStatus()
{
StatusText.Text = $"Drawer: {(DemoDrawer.IsOpen ? "Open" : "Closed")}";
}
private static void EnableMouseSwipeGesture(Control control) private static void EnableMouseSwipeGesture(Control control)
{ {
var recognizer = control.GestureRecognizers var recognizer = control.GestureRecognizers
@@ -42,4 +75,16 @@ public partial class DrawerPageDemo : UserControl
recognizer?.IsMouseEnabled = true; recognizer?.IsMouseEnabled = true;
} }
private void OnLayoutChanged(object? sender, SelectionChangedEventArgs e)
{
DemoDrawer.DrawerLayoutBehavior = (sender as ComboBox)?.SelectedIndex switch
{
0 => DrawerLayoutBehavior.CompactOverlay,
1 => DrawerLayoutBehavior.CompactInline,
2 => DrawerLayoutBehavior.Split,
3 => DrawerLayoutBehavior.Overlay,
_ => DrawerLayoutBehavior.CompactOverlay
};
}
} }

View File

@@ -12,7 +12,7 @@
<ScrollViewer DockPanel.Dock="Right" Width="260"> <ScrollViewer DockPanel.Dock="Right" Width="260">
<StackPanel Margin="12" Spacing="8"> <StackPanel Margin="12" Spacing="8">
<TextBlock Text="Configuration" FontWeight="SemiBold" FontSize="16" /> <TextBlock Text="Configuration" FontWeight="SemiBold" FontSize="16" />
<TextBlock Text="Navigation" FontWeight="SemiBold" FontSize="13" /> <TextBlock Text="Navigation" FontWeight="SemiBold" FontSize="14" />
<Button Content="Push Page" <Button Content="Push Page"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
@@ -26,6 +26,20 @@
<Separator /> <Separator />
<TextBlock Text="Modal Actions" FontWeight="SemiBold" FontSize="14" />
<Button Name="PushModalButton"
Content="Push Modal"
HorizontalAlignment="Stretch"
Click="OnPushModal" />
<Button Name="PopModalButton"
Content="Pop Modal"
HorizontalAlignment="Stretch"
Click="OnPopModal" />
<Button Name="PopAllModalsButton"
Content="Pop All Modals"
HorizontalAlignment="Stretch"
Click="OnPopAllModals" />
<TextBlock Text="Options" FontWeight="SemiBold" FontSize="14" /> <TextBlock Text="Options" FontWeight="SemiBold" FontSize="14" />
<CheckBox Name="HasNavBarCheck" <CheckBox Name="HasNavBarCheck"
@@ -35,20 +49,38 @@
<CheckBox Name="HasBackButtonCheck" <CheckBox Name="HasBackButtonCheck"
Content="Has Back Button" Content="Has Back Button"
IsChecked="True" IsChecked="True"
IsCheckedChanged="OnHasBackButonChanged" /> IsCheckedChanged="OnHasBackButtonChanged" />
<CheckBox Name="HasShadowCheck"
Content="Has Shadow"
IsChecked="True"
IsCheckedChanged="OnHasShadowChanged" />
<CheckBox Name="large" Content="Large" />
<Separator />
<TextBlock Text="Modal Transition" FontWeight="SemiBold" FontSize="14" />
<ComboBox Name="TransitionCombo"
SelectedIndex="0"
HorizontalAlignment="Stretch"
SelectionChanged="OnTransitionChanged">
<ComboBoxItem Content="Slide from Bottom" />
<ComboBoxItem Content="CrossFade" />
<ComboBoxItem Content="None" />
</ComboBox>
<Separator /> <Separator />
<TextBlock Text="Status" FontWeight="SemiBold" FontSize="14" /> <TextBlock Text="Status" FontWeight="SemiBold" FontSize="14" />
<TextBlock Name="StatusText" <TextBlock Name="StatusText"
Text="Depth: 1" Text="Depth: 1"
Opacity="0.7"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock Name="HeaderText" <TextBlock Name="HeaderText"
Text="Current: Home" Text="Current: Home"
Opacity="0.7"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<ToggleSwitch Content="Large" Name="large" /> <TextBlock Name="ModalText"
Text="Modals: 0"
TextWrapping="Wrap" />
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>

View File

@@ -1,3 +1,5 @@
using System;
using Avalonia.Animation;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Interactivity; using Avalonia.Interactivity;
@@ -6,6 +8,7 @@ namespace Semi.Avalonia.Demo.Pages;
public partial class NavigationPageDemo : UserControl public partial class NavigationPageDemo : UserControl
{ {
private int _pageCount; private int _pageCount;
private int _modalCount;
public NavigationPageDemo() public NavigationPageDemo()
{ {
@@ -15,7 +18,7 @@ public partial class NavigationPageDemo : UserControl
private async void OnLoaded(object? sender, RoutedEventArgs e) private async void OnLoaded(object? sender, RoutedEventArgs e)
{ {
await DemoNav.PushAsync(NavigationDemoHelper.MakePage("Home", "Welcome!\nUse the buttons to push and pop pages.", 0), null); await DemoNav.PushAsync(NavigationDemoHelper.MakePage("Home", "Welcome!\nUse the buttons to push and pop pages/modals.", 0), null);
UpdateStatus(); UpdateStatus();
} }
@@ -42,6 +45,27 @@ public partial class NavigationPageDemo : UserControl
UpdateStatus(); UpdateStatus();
} }
private async void OnPushModal(object? sender, RoutedEventArgs e)
{
_modalCount++;
var modal = NavigationDemoHelper.MakePage($"Modal {_modalCount}", "This page was presented modally.\nTap 'Pop Modal' to dismiss.", _modalCount);
await DemoNav.PushModalAsync(modal);
UpdateStatus();
}
private async void OnPopModal(object? sender, RoutedEventArgs e)
{
await DemoNav.PopModalAsync();
UpdateStatus();
}
private async void OnPopAllModals(object? sender, RoutedEventArgs e)
{
await DemoNav.PopAllModalsAsync();
_modalCount = 0;
UpdateStatus();
}
private void OnHasNavBarChanged(object? sender, RoutedEventArgs e) private void OnHasNavBarChanged(object? sender, RoutedEventArgs e)
{ {
if (DemoNav == null) if (DemoNav == null)
@@ -50,7 +74,7 @@ public partial class NavigationPageDemo : UserControl
NavigationPage.SetHasNavigationBar(DemoNav.CurrentPage, HasNavBarCheck.IsChecked == true); NavigationPage.SetHasNavigationBar(DemoNav.CurrentPage, HasNavBarCheck.IsChecked == true);
} }
private void OnHasBackButonChanged(object? sender, RoutedEventArgs e) private void OnHasBackButtonChanged(object? sender, RoutedEventArgs e)
{ {
if (DemoNav == null) if (DemoNav == null)
return; return;
@@ -58,9 +82,30 @@ public partial class NavigationPageDemo : UserControl
NavigationPage.SetHasBackButton(DemoNav.CurrentPage, HasBackButtonCheck.IsChecked == true); NavigationPage.SetHasBackButton(DemoNav.CurrentPage, HasBackButtonCheck.IsChecked == true);
} }
private void OnHasShadowChanged(object? sender, RoutedEventArgs e)
{
if (DemoNav == null)
return;
if (DemoNav.CurrentPage != null)
DemoNav.HasShadow = HasShadowCheck.IsChecked == true;
}
private void OnTransitionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DemoNav == null)
return;
DemoNav.ModalTransition = TransitionCombo.SelectedIndex switch
{
1 => new CrossFade(TimeSpan.FromMilliseconds(250)),
2 => null,
_ => new PageSlide(TimeSpan.FromMilliseconds(300), PageSlide.SlideAxis.Vertical)
};
}
private void UpdateStatus() private void UpdateStatus()
{ {
StatusText.Text = $"Depth: {DemoNav.StackDepth}"; StatusText.Text = $"Depth: {DemoNav.StackDepth}";
HeaderText.Text = $"Current: {DemoNav.CurrentPage?.Header ?? "(none)"}"; HeaderText.Text = $"Current: {DemoNav.CurrentPage?.Header ?? "(none)"}";
ModalText.Text = $"Modals: {DemoNav.ModalStack.Count}";
} }
} }

View File

@@ -12,16 +12,14 @@ public partial class PaletteDemo : UserControl
public PaletteDemo() public PaletteDemo()
{ {
InitializeComponent(); InitializeComponent();
this.DataContext = PaletteDemoViewModel.Instance.Value; this.DataContext = new PaletteDemoViewModel();
} }
protected override async void OnApplyTemplate(TemplateAppliedEventArgs e) protected override async void OnApplyTemplate(TemplateAppliedEventArgs e)
{ {
base.OnApplyTemplate(e); base.OnApplyTemplate(e);
if (this.DataContext is PaletteDemoViewModel vm && !vm.IsInitialized) PaletteDemoViewModel? vm = this.DataContext as PaletteDemoViewModel;
{ await Dispatcher.UIThread.InvokeAsync(() => { vm?.InitializeResources(); });
await Dispatcher.UIThread.InvokeAsync(() => { vm?.InitializeResources(); });
}
} }
public async Task Copy(object? o) public async Task Copy(object? o)

View File

@@ -3,7 +3,8 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Semi.Avalonia.Demo.Pages.WindowCustomizationsPage"> x:Class="Semi.Avalonia.Demo.Pages.WindowCustomizationsPage"
x:CompileBindings="True">
<StackPanel <StackPanel
Spacing="10" Spacing="10"

View File

@@ -3,6 +3,7 @@
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,353 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Layout;
using Avalonia.Styling;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Semi.Avalonia.Demo.Pages;
namespace Semi.Avalonia.Demo.ViewModels;
public partial class MainViewModel : ObservableObject
{
private readonly Dictionary<string, NavigationItemViewModel> _itemsByTitle = new(StringComparer.Ordinal);
private readonly IReadOnlyList<NavigationSectionViewModel> _allSections;
[ObservableProperty] public partial string? SearchText { get; set; }
public string DocumentationUrl => "https://docs.irihi.tech/semi";
public string RepoUrl => "https://github.com/irihitech/Semi.Avalonia";
public IReadOnlyList<MenuItemViewModel> MenuItems { get; }
public IReadOnlyList<NavigationSectionViewModel> Sections { get; }
public ObservableCollection<NavigationSectionViewModel> FilteredSections { get; } = [];
public bool ShowEmptySearchState => FilteredSections.Count == 0 && !string.IsNullOrWhiteSpace(SearchText);
public ContentPage? CurrentPage => SelectedItem?.Page;
public string SelectedPageTitle => SelectedItem?.Title ?? "Overview";
public NavigationItemViewModel? SelectedItem
{
get;
private set
{
if (ReferenceEquals(field, value))
{
return;
}
var previous = field;
if (SetProperty(ref field, value))
{
previous?.IsSelected = false;
value?.IsSelected = true;
OnPropertyChanged(nameof(CurrentPage));
OnPropertyChanged(nameof(SelectedPageTitle));
}
}
}
public MainViewModel()
{
MenuItems =
[
new MenuItemViewModel
{
Header = "Theme",
Items =
[
new MenuItemViewModel { Header = "Auto", Command = FollowSystemThemeCommand },
new MenuItemViewModel { Header = "Aquatic", Command = SelectThemeCommand, CommandParameter = SemiTheme.Aquatic },
new MenuItemViewModel { Header = "Desert", Command = SelectThemeCommand, CommandParameter = SemiTheme.Desert },
new MenuItemViewModel { Header = "Dusk", Command = SelectThemeCommand, CommandParameter = SemiTheme.Dusk },
new MenuItemViewModel { Header = "NightSky", Command = SelectThemeCommand, CommandParameter = SemiTheme.NightSky },
]
},
new MenuItemViewModel
{
Header = "Locale",
Items =
[
new MenuItemViewModel { Header = "简体中文", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("zh-CN") },
new MenuItemViewModel { Header = "English", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("en-US") },
new MenuItemViewModel { Header = "日本語", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("ja-JP") },
new MenuItemViewModel { Header = "한국어", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("ko-KR") },
new MenuItemViewModel { Header = "English (UK)", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("en-GB") },
new MenuItemViewModel { Header = "Italiano", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("it-IT") },
new MenuItemViewModel { Header = "Italiano (Switzerland)", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("it-CH") },
new MenuItemViewModel { Header = "Nederlands", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("nl-NL") },
new MenuItemViewModel { Header = "Nederlands (Belgium)", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("nl-BE") },
new MenuItemViewModel { Header = "Українська", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("uk-UA") },
new MenuItemViewModel { Header = "Русский", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("ru-RU") },
new MenuItemViewModel { Header = "繁體中文", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("zh-TW") },
new MenuItemViewModel { Header = "Deutsch", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("de-DE") },
new MenuItemViewModel { Header = "Español", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("es-ES") },
new MenuItemViewModel { Header = "Polski", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("pl-PL") },
new MenuItemViewModel { Header = "Français", Command = SelectLocaleCommand, CommandParameter = new CultureInfo("fr-FR") },
]
}
];
Sections = _allSections =
[
new NavigationSectionViewModel("Overview",
[
CreateItem("Overview", static () => new Overview()),
CreateItem("About Us", static () => new AboutUs()),
]),
new NavigationSectionViewModel("Resource Browser",
[
CreateItem("Palette", static () => new PaletteDemo()),
CreateItem("HighContrastTheme", static () => new HighContrastDemo()),
CreateItem("Variables", static () => new VariablesDemo()),
CreateItem("Icon", static () => new IconDemo()),
]),
new NavigationSectionViewModel("Separate Pack",
[
CreateItem("ColorPicker", static () => new ColorPickerDemo()),
CreateItem("DataGrid", static () => new DataGridDemo()),
]),
new NavigationSectionViewModel("Basic",
[
CreateItem("TextBlock", static () => new TextBlockDemo()),
CreateItem("SelectableTextBlock", static () => new SelectableTextBlockDemo()),
CreateItem("Border", static () => new BorderDemo()),
CreateItem("PathIcon", static () => new PathIconDemo()),
]),
new NavigationSectionViewModel("Button",
[
CreateItem("Button", static () => new ButtonDemo()),
CreateItem("HyperlinkButton", static () => new HyperlinkButtonDemo()),
CreateItem("CheckBox", static () => new CheckBoxDemo()),
CreateItem("RadioButton", static () => new RadioButtonDemo()),
CreateItem("ToggleSwitch", static () => new ToggleSwitchDemo()),
]),
new NavigationSectionViewModel("Input",
[
CreateItem("TextBox", static () => new TextBoxDemo()),
CreateItem("AutoCompleteBox", static () => new AutoCompleteBoxDemo()),
CreateItem("ComboBox", static () => new ComboBoxDemo()),
CreateItem("ButtonSpinner", static () => new ButtonSpinnerDemo()),
CreateItem("NumericUpDown", static () => new NumericUpDownDemo()),
CreateItem("Slider", static () => new SliderDemo()),
CreateItem("ManagedFileChooser", static () => new ManagedFileChooserDemo()),
]),
new NavigationSectionViewModel("Date/Time",
[
CreateItem("Calendar", static () => new CalendarDemo()),
CreateItem("CalendarDatePicker", static () => new CalendarDatePickerDemo()),
CreateItem("DatePicker", static () => new DatePickerDemo()),
CreateItem("TimePicker", static () => new TimePickerDemo()),
]),
new NavigationSectionViewModel("Navigation",
[
CreateItem("ContentPage", static () => new ContentPageDemo()),
CreateItem("CarouselPage", static () => new CarouselPageDemo()),
CreateItem("DrawerPage", static () => new DrawerPageDemo()),
CreateItem("NavigationPage", static () => new NavigationPageDemo()),
CreateItem("TabbedPage", static () => new TabbedPageDemo()),
CreateItem("TabControl", static () => new TabControlDemo()),
CreateItem("TabStrip", static () => new TabStripDemo()),
CreateItem("TreeView", static () => new TreeViewDemo()),
]),
new NavigationSectionViewModel("Show",
[
CreateItem("Carousel", static () => new CarouselDemo()),
CreateItem("PipsPager", static () => new PipsPagerDemo()),
CreateItem("Expander", static () => new ExpanderDemo()),
CreateItem("Flyout", static () => new FlyoutDemo()),
CreateItem("HeaderedContentControl", static () => new HeaderedContentControlDemo()),
CreateItem("Label", static () => new LabelDemo()),
CreateItem("ListBox", static () => new ListBoxDemo()),
CreateItem("SplitView", static () => new SplitViewDemo()),
CreateItem("ToolTip", static () => new ToolTipDemo()),
]),
new NavigationSectionViewModel("Feedback",
[
CreateItem("DataValidationErrors", static () => new DataValidationErrorsDemo()),
CreateItem("Notification", static () => new NotificationDemo()),
CreateItem("ProgressBar", static () => new ProgressBarDemo()),
CreateItem("RefreshContainer", static () => new RefreshContainerDemo()),
]),
new NavigationSectionViewModel("Other",
[
CreateItem("CommandBar", static () => new CommandBarDemo()),
CreateItem("GridSplitter", static () => new GridSplitterDemo()),
CreateItem("Menu", static () => new MenuDemo()),
CreateItem("ScrollViewer", static () => new ScrollViewerDemo()),
CreateItem("ThemeVariantScope", static () => new ThemeVariantDemo()),
CreateItem("WindowCustomizationsPage", static () => new WindowCustomizationsPage()),
]),
];
SelectedItem = Sections[0].Items[0];
RefreshFilteredSections();
}
public bool TryNavigateTo(string title)
{
if (_itemsByTitle.TryGetValue(title, out var item))
{
SelectedItem = item;
return true;
}
return false;
}
partial void OnSearchTextChanged(string? value)
{
RefreshFilteredSections();
}
[RelayCommand]
private void NavigateTo(object? parameter)
{
if (parameter is NavigationItemViewModel item)
{
SelectedItem = item;
}
}
[RelayCommand]
private void FollowSystemTheme()
{
Application.Current?.RegisterFollowSystemTheme();
}
[RelayCommand]
private void ToggleTheme()
{
var app = Application.Current;
if (app is null) return;
var theme = app.ActualThemeVariant;
app.RequestedThemeVariant = theme == ThemeVariant.Dark ? ThemeVariant.Light : ThemeVariant.Dark;
app.UnregisterFollowSystemTheme();
}
[RelayCommand]
private void SelectTheme(object? obj)
{
var app = Application.Current;
if (app is null) return;
app.RequestedThemeVariant = obj as ThemeVariant;
app.UnregisterFollowSystemTheme();
}
[RelayCommand]
private void SelectLocale(object? obj)
{
var app = Application.Current;
if (app is null) return;
SemiTheme.OverrideLocaleResources(app, obj as CultureInfo);
}
[RelayCommand]
private static async Task OpenUrl(string url)
{
var launcher = ResolveDefaultTopLevel()?.Launcher;
if (launcher is not null)
{
await launcher.LaunchUriAsync(new Uri(url));
}
}
private NavigationItemViewModel CreateItem(string title, Func<Control> contentFactory)
{
var item = new NavigationItemViewModel(title, NavigateToCommand, contentFactory);
_itemsByTitle.Add(title, item);
return item;
}
private void RefreshFilteredSections()
{
var search = string.IsNullOrWhiteSpace(SearchText) ? string.Empty : SearchText.Trim();
FilteredSections.Clear();
foreach (var section in _allSections)
{
if (search.Length == 0 ||
section.Header.Contains(search, StringComparison.InvariantCultureIgnoreCase))
{
FilteredSections.Add(section);
continue;
}
var matchedItems = section.Items
.Where(item => item.Title.Contains(search, StringComparison.InvariantCultureIgnoreCase))
.ToArray();
if (matchedItems.Length > 0)
{
FilteredSections.Add(new NavigationSectionViewModel(section.Header, matchedItems));
}
}
OnPropertyChanged(nameof(ShowEmptySearchState));
}
private static TopLevel? ResolveDefaultTopLevel()
{
return Application.Current?.ApplicationLifetime switch
{
IClassicDesktopStyleApplicationLifetime desktopLifetime => desktopLifetime.MainWindow,
ISingleViewApplicationLifetime singleView => TopLevel.GetTopLevel(singleView.MainView),
_ => null
};
}
}
public class NavigationSectionViewModel
{
public NavigationSectionViewModel(string header, IReadOnlyList<NavigationItemViewModel> items)
{
Header = header;
Items = items;
}
public string Header { get; }
public IReadOnlyList<NavigationItemViewModel> Items { get; }
}
public partial class NavigationItemViewModel : ObservableObject
{
private readonly Func<Control> _contentFactory;
public NavigationItemViewModel(string title, ICommand navigateCommand, Func<Control> contentFactory)
{
Title = title;
NavigateCommand = navigateCommand;
_contentFactory = contentFactory;
}
public string Title { get; }
public ICommand NavigateCommand { get; }
public ContentPage Page => field ??= new ContentPage
{
Header = Title,
Background = null,
HorizontalContentAlignment = HorizontalAlignment.Stretch,
VerticalContentAlignment = VerticalAlignment.Stretch,
Content = _contentFactory()
};
[ObservableProperty] public partial bool IsSelected { get; set; }
}
public class MenuItemViewModel
{
public string? Header { get; set; }
public ICommand? Command { get; set; }
public object? CommandParameter { get; set; }
public IList<MenuItemViewModel>? Items { get; set; }
}

View File

@@ -14,8 +14,6 @@ namespace Semi.Avalonia.Demo.ViewModels;
public partial class PaletteDemoViewModel : ObservableObject public partial class PaletteDemoViewModel : ObservableObject
{ {
public static Lazy<PaletteDemoViewModel> Instance { get; } = new(() => new PaletteDemoViewModel());
public bool IsInitialized { get; private set; }
private readonly string[] _predefinedColorNames = private readonly string[] _predefinedColorNames =
[ [
"Red", "Pink", "Purple", "Violet", "Indigo", "Red", "Pink", "Purple", "Violet", "Indigo",
@@ -46,7 +44,6 @@ public partial class PaletteDemoViewModel : ObservableObject
InitializePalette(); InitializePalette();
InitializeFunctionalColors(); InitializeFunctionalColors();
InitializeShadows(); InitializeShadows();
IsInitialized = true;
} }
private void InitializePalette() private void InitializePalette()

View File

@@ -4,142 +4,283 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:Semi.Avalonia.Demo.ViewModels" xmlns:pages="using:Semi.Avalonia.Demo.Pages"
xmlns:views="clr-namespace:Semi.Avalonia.Demo.Views"
d:DesignHeight="450" d:DesignHeight="450"
d:DesignWidth="800" d:DesignWidth="800"
x:DataType="vm:MainViewModel" x:DataType="views:MainViewModel"
mc:Ignorable="d"> mc:Ignorable="d">
<UserControl.Styles> <UserControl.Resources>
<Style Selector="TextBlock.NavSectionHeader"> <ControlTheme x:Key="CategoryTabItem" TargetType="TabItem">
<Setter Property="Margin" Value="12,10,12,2" /> <Setter Property="IsEnabled" Value="False" />
<Setter Property="FontSize" Value="12" /> <Setter Property="Template">
<Setter Property="FontWeight" Value="Bold" /> <ControlTemplate TargetType="TabItem">
<Setter Property="Foreground" Value="{DynamicResource SemiColorText1}" />
</Style>
<Style Selector="Border.NavItemHost">
<Setter Property="Margin" Value="6,0" />
<Setter Property="Background" Value="Transparent" />
</Style>
<Style Selector="Border.NavItemHost.Selected">
<Setter Property="Background" Value="{DynamicResource SemiColorPrimaryLight}" />
</Style>
<Style Selector="Button.NavItem">
<Setter Property="Theme" Value="{DynamicResource BorderlessButton}" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="Padding" Value="12,8" />
<Setter Property="Foreground" Value="{DynamicResource SemiColorText0}" />
</Style>
<Style Selector="Button.NavItem.Selected">
<Setter Property="Foreground" Value="{DynamicResource SemiColorPrimary}" />
</Style>
</UserControl.Styles>
<DrawerPage
Name="MainDrawer"
Margin="8"
Background="Transparent"
Content="{Binding CurrentPage}"
DrawerLayoutBehavior="{OnFormFactor Split, Mobile=Overlay}"
DrawerLength="300"
IsOpen="True">
<DrawerPage.Header>
<StackPanel Orientation="Horizontal" Spacing="8">
<SelectableTextBlock
VerticalAlignment="Center"
Classes="H6"
Text="Semi Avalonia"
Theme="{DynamicResource TitleSelectableTextBlock}" />
<TextBlock VerticalAlignment="Center" Text="/" />
<SelectableTextBlock
VerticalAlignment="Center"
Classes="Secondary"
Text="{Binding SelectedPageTitle}" />
</StackPanel>
</DrawerPage.Header>
<DrawerPage.DrawerHeader>
<TextBox
Margin="8"
Classes="ClearButton"
PlaceholderText="Search demos or sections"
Text="{Binding SearchText}" />
</DrawerPage.DrawerHeader>
<DrawerPage.Drawer>
<ScrollViewer HorizontalScrollBarVisibility="Disabled">
<StackPanel>
<ItemsControl ItemsSource="{Binding FilteredSections}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:NavigationSectionViewModel">
<StackPanel Margin="0,0,0,10">
<TextBlock Classes="NavSectionHeader" Text="{Binding Header}" />
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:NavigationItemViewModel">
<Border Classes="NavItemHost" Classes.Selected="{Binding IsSelected}">
<Button
Classes="NavItem"
FontWeight="Normal"
Classes.Selected="{Binding IsSelected}"
Command="{Binding NavigateCommand}"
CommandParameter="{Binding}"
Content="{Binding Title}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock <TextBlock
Margin="16,12,16,0" Margin="4"
Foreground="{DynamicResource SemiColorText1}" FontSize="12"
IsVisible="{Binding ShowEmptySearchState}" FontWeight="Bold"
Text="No demo pages matched your search." /> Text="{TemplateBinding Header}" />
</ControlTemplate>
</Setter>
<Style Selector="^:disabled /template/ TextBlock">
<Setter Property="Foreground" Value="{DynamicResource SemiColorText1}" />
</Style>
</ControlTheme>
</UserControl.Resources>
<Grid RowDefinitions="Auto, *">
<Border
Grid.Row="0"
Margin="8"
Padding="12,4"
Theme="{DynamicResource CardBorder}">
<Panel>
<StackPanel Orientation="Horizontal" Spacing="8">
<ToggleSwitch
Name="ExpandButton"
Content="{StaticResource SemiIconSidebar}"
Theme="{DynamicResource IconBorderlessToggleSwitch}" />
<SelectableTextBlock
VerticalAlignment="Center"
Classes="H6"
Text="Semi Avalonia"
Theme="{DynamicResource TitleSelectableTextBlock}" />
<SelectableTextBlock VerticalAlignment="Center" Text="/" />
<SelectableTextBlock
VerticalAlignment="Center"
Classes="Secondary"
Text="{ReflectionBinding #tab.SelectedItem.Header}" />
</StackPanel> </StackPanel>
</ScrollViewer> <StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
</DrawerPage.Drawer> <Button
Command="{Binding OpenUrlCommand}"
CommandParameter="{Binding DocumentationUrl}"
Content="{StaticResource SemiIconGlobe}"
Theme="{DynamicResource IconBorderlessButton}" />
<DrawerPage.DrawerFooter> <Button
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal"> Command="{Binding OpenUrlCommand}"
<Button CommandParameter="{Binding RepoUrl}"
Command="{Binding OpenUrlCommand}" Content="{StaticResource SemiIconGithubLogo}"
CommandParameter="{Binding DocumentationUrl}" Theme="{DynamicResource IconBorderlessButton}" />
Content="{StaticResource SemiIconGlobe}"
Theme="{DynamicResource IconBorderlessButton}" />
<Button <ToggleSwitch
Command="{Binding OpenUrlCommand}" Command="{Binding ToggleThemeCommand}"
CommandParameter="{Binding RepoUrl}" OffContent="{StaticResource SemiIconSun}"
Content="{StaticResource SemiIconGithubLogo}" OnContent="{StaticResource SemiIconMoon}"
Theme="{DynamicResource IconBorderlessButton}" /> Theme="{DynamicResource IconBorderlessToggleSwitch}" />
<ToggleSwitch <Button Content="{StaticResource SemiIconMenu}" Theme="{DynamicResource IconBorderlessButton}">
Command="{Binding ToggleThemeCommand}" <Button.Flyout>
OffContent="{StaticResource SemiIconSun}" <MenuFlyout ItemsSource="{Binding MenuItems}" Placement="Bottom" />
OnContent="{StaticResource SemiIconMoon}" </Button.Flyout>
Theme="{DynamicResource IconBorderlessToggleSwitch}" /> <Button.Styles>
<Style x:DataType="views:MenuItemViewModel" Selector="MenuItem">
<Button Content="{StaticResource SemiIconMenu}" Theme="{DynamicResource IconBorderlessButton}"> <Setter Property="Header" Value="{Binding Header}" />
<Button.Flyout> <Setter Property="ItemsSource" Value="{Binding Items}" />
<MenuFlyout ItemsSource="{Binding MenuItems}" Placement="Bottom" /> <Setter Property="Command" Value="{Binding Command}" />
</Button.Flyout> <Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
<Button.Styles> </Style>
<Style x:DataType="vm:MenuItemViewModel" Selector="MenuItem"> </Button.Styles>
<Setter Property="Header" Value="{Binding Header}" /> </Button>
<Setter Property="ItemsSource" Value="{Binding Items}" /> </StackPanel>
<Setter Property="Command" Value="{Binding Command}" /> </Panel>
<Setter Property="CommandParameter" Value="{Binding CommandParameter}" /> </Border>
</Style> <TabControl
</Button.Styles> Name="tab"
</Button> Grid.Row="1"
</StackPanel> Margin="8"
</DrawerPage.DrawerFooter> Padding="20,0,0,0"
</DrawerPage> Classes.Dismiss="{Binding #ExpandButton.IsChecked}"
TabStripPlacement="Left"
Theme="{DynamicResource ScrollLineTabControl}">
<TabControl.Styles>
<Style Selector=".Dismiss /template/ ScrollViewer#PART_ScrollViewer">
<Setter Property="IsVisible" Value="False" />
</Style>
</TabControl.Styles>
<TabControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</TabControl.ItemsPanel>
<TabItem Header="Overview">
<pages:Overview />
</TabItem>
<TabItem Header="About Us">
<pages:AboutUs />
</TabItem>
<TabItem Header="Resource Browser" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="Palette">
<pages:PaletteDemo />
</TabItem>
<TabItem Header="HighContrastTheme">
<pages:HighContrastDemo />
</TabItem>
<TabItem Header="Variables">
<pages:VariablesDemo />
</TabItem>
<TabItem Header="Icon">
<pages:IconDemo />
</TabItem>
<TabItem Header="Separate Pack" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="ColorPicker">
<pages:ColorPickerDemo />
</TabItem>
<TabItem Header="DataGrid">
<pages:DataGridDemo />
</TabItem>
<!-- <TabItem Header="TreeDataGrid"> -->
<!-- <pages:TreeDataGridDemo /> -->
<!-- </TabItem> -->
<TabItem Header="Basic" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="TextBlock">
<pages:TextBlockDemo />
</TabItem>
<TabItem Header="SelectableTextBlock">
<pages:SelectableTextBlockDemo />
</TabItem>
<TabItem Header="Border">
<pages:BorderDemo />
</TabItem>
<TabItem Header="PathIcon">
<pages:PathIconDemo />
</TabItem>
<TabItem Header="Button" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="Button">
<pages:ButtonDemo />
</TabItem>
<TabItem Header="HyperlinkButton">
<pages:HyperlinkButtonDemo />
</TabItem>
<TabItem Header="CheckBox">
<pages:CheckBoxDemo />
</TabItem>
<TabItem Header="RadioButton">
<pages:RadioButtonDemo />
</TabItem>
<TabItem Header="ToggleSwitch">
<pages:ToggleSwitchDemo />
</TabItem>
<TabItem Header="Input" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="TextBox">
<pages:TextBoxDemo />
</TabItem>
<TabItem Header="AutoCompleteBox">
<pages:AutoCompleteBoxDemo />
</TabItem>
<TabItem Header="ComboBox">
<pages:ComboBoxDemo />
</TabItem>
<TabItem Header="ButtonSpinner">
<pages:ButtonSpinnerDemo />
</TabItem>
<TabItem Header="NumericUpDown">
<pages:NumericUpDownDemo />
</TabItem>
<TabItem Header="Slider">
<pages:SliderDemo />
</TabItem>
<TabItem Header="ManagedFileChooser">
<pages:ManagedFileChooserDemo />
</TabItem>
<TabItem Header="Date/Time" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="Calendar">
<pages:CalendarDemo />
</TabItem>
<TabItem Header="CalendarDatePicker">
<pages:CalendarDatePickerDemo />
</TabItem>
<TabItem Header="DatePicker">
<pages:DatePickerDemo />
</TabItem>
<TabItem Header="TimePicker">
<pages:TimePickerDemo />
</TabItem>
<TabItem Header="Navigation" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="ContentPage">
<pages:ContentPageDemo />
</TabItem>
<TabItem Header="CarouselPage">
<pages:CarouselPageDemo />
</TabItem>
<TabItem Header="DrawerPage">
<pages:DrawerPageDemo />
</TabItem>
<TabItem Header="NavigationPage">
<pages:NavigationPageDemo />
</TabItem>
<TabItem Header="TabbedPage">
<pages:TabbedPageDemo />
</TabItem>
<TabItem Header="TabControl">
<pages:TabControlDemo />
</TabItem>
<TabItem Header="TabStrip">
<pages:TabStripDemo />
</TabItem>
<TabItem Header="TreeView">
<pages:TreeViewDemo />
</TabItem>
<TabItem Header="Show" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="Carousel">
<pages:CarouselDemo />
</TabItem>
<TabItem Header="PipsPager">
<pages:PipsPagerDemo />
</TabItem>
<TabItem Header="Expander">
<pages:ExpanderDemo />
</TabItem>
<TabItem Header="Flyout">
<pages:FlyoutDemo />
</TabItem>
<TabItem Header="HeaderedContentControl">
<pages:HeaderedContentControlDemo />
</TabItem>
<TabItem Header="Label">
<pages:LabelDemo />
</TabItem>
<TabItem Header="ListBox">
<pages:ListBoxDemo />
</TabItem>
<TabItem Header="SplitView">
<pages:SplitViewDemo />
</TabItem>
<TabItem Header="ToolTip">
<pages:ToolTipDemo />
</TabItem>
<TabItem Header="Feedback" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="DataValidationErrors">
<pages:DataValidationErrorsDemo />
</TabItem>
<TabItem Header="Notification">
<pages:NotificationDemo />
</TabItem>
<TabItem Header="ProgressBar">
<pages:ProgressBarDemo />
</TabItem>
<TabItem Header="RefreshContainer">
<pages:RefreshContainerDemo />
</TabItem>
<TabItem Header="Other" Theme="{DynamicResource CategoryTabItem}" />
<TabItem Header="CommandBar">
<pages:CommandBarDemo />
</TabItem>
<TabItem Header="GridSplitter">
<pages:GridSplitterDemo />
</TabItem>
<TabItem Header="Menu">
<pages:MenuDemo />
</TabItem>
<TabItem Header="ScrollViewer">
<pages:ScrollViewerDemo />
</TabItem>
<TabItem Header="ThemeVariantScope">
<pages:ThemeVariantDemo />
</TabItem>
<TabItem Header="WindowCustomizationsPage">
<pages:WindowCustomizationsPage />
</TabItem>
</TabControl>
</Grid>
</UserControl> </UserControl>

View File

@@ -1,22 +1,250 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using System.Windows.Input;
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Styling;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging;
using Semi.Avalonia.Demo.ViewModels;
namespace Semi.Avalonia.Demo.Views; namespace Semi.Avalonia.Demo.Views;
public partial class MainView : UserControl public partial class MainView : UserControl
{ {
private readonly MainViewModel _viewModel;
public MainView() public MainView()
{ {
InitializeComponent(); InitializeComponent();
DataContext = _viewModel = new MainViewModel(); this.DataContext = new MainViewModel();
WeakReferenceMessenger.Default.Register<string, string>(this, "JumpTo", MessageHandler); WeakReferenceMessenger.Default.Register<string, string>(this, "JumpTo", MessageHandler);
} }
private void MessageHandler(object _, string message) private void MessageHandler(object _, string message)
{ {
_viewModel.TryNavigateTo(message); foreach (var item in tab.ItemsView)
{
if (item is TabItem tabItem && tabItem.Header is not null && tabItem.Header.Equals(message))
{
tab.SelectedItem = tabItem;
break;
}
}
} }
} }
public partial class MainViewModel : ObservableObject
{
public string DocumentationUrl => "https://docs.irihi.tech/semi";
public string RepoUrl => "https://github.com/irihitech/Semi.Avalonia";
public IReadOnlyList<MenuItemViewModel> MenuItems { get; }
public MainViewModel()
{
MenuItems =
[
new MenuItemViewModel
{
Header = "Theme",
Items =
[
new MenuItemViewModel
{
Header = "Auto",
Command = FollowSystemThemeCommand
},
new MenuItemViewModel
{
Header = "Aquatic",
Command = SelectThemeCommand,
CommandParameter = SemiTheme.Aquatic
},
new MenuItemViewModel
{
Header = "Desert",
Command = SelectThemeCommand,
CommandParameter = SemiTheme.Desert
},
new MenuItemViewModel
{
Header = "Dusk",
Command = SelectThemeCommand,
CommandParameter = SemiTheme.Dusk
},
new MenuItemViewModel
{
Header = "NightSky",
Command = SelectThemeCommand,
CommandParameter = SemiTheme.NightSky
},
]
},
new MenuItemViewModel
{
Header = "Locale",
Items =
[
new MenuItemViewModel
{
Header = "简体中文",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("zh-CN")
},
new MenuItemViewModel
{
Header = "English",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("en-US")
},
new MenuItemViewModel
{
Header = "日本語",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("ja-JP")
},
new MenuItemViewModel
{
Header = "한국어",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("ko-KR")
},
new MenuItemViewModel
{
Header = "English (UK)",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("en-GB")
},
new MenuItemViewModel
{
Header = "Italiano",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("it-IT")
},
new MenuItemViewModel
{
Header = "Italiano (Switzerland)",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("it-CH")
},
new MenuItemViewModel
{
Header = "Nederlands",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("nl-NL")
},
new MenuItemViewModel
{
Header = "Nederlands (Belgium)",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("nl-BE")
},
new MenuItemViewModel
{
Header = "Українська",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("uk-UA")
},
new MenuItemViewModel
{
Header = "Русский",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("ru-RU")
},
new MenuItemViewModel
{
Header = "繁體中文",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("zh-TW")
},
new MenuItemViewModel
{
Header = "Deutsch",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("de-DE")
},
new MenuItemViewModel
{
Header = "Español",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("es-ES")
},
new MenuItemViewModel
{
Header = "Polski",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("pl-PL")
},
new MenuItemViewModel
{
Header = "Français",
Command = SelectLocaleCommand,
CommandParameter = new CultureInfo("fr-FR")
},
]
}
];
}
[RelayCommand]
private void FollowSystemTheme()
{
Application.Current?.RegisterFollowSystemTheme();
}
[RelayCommand]
private void ToggleTheme()
{
var app = Application.Current;
if (app is null) return;
var theme = app.ActualThemeVariant;
app.RequestedThemeVariant = theme == ThemeVariant.Dark ? ThemeVariant.Light : ThemeVariant.Dark;
app.UnregisterFollowSystemTheme();
}
[RelayCommand]
private void SelectTheme(object? obj)
{
var app = Application.Current;
if (app is null) return;
app.RequestedThemeVariant = obj as ThemeVariant;
app.UnregisterFollowSystemTheme();
}
[RelayCommand]
private void SelectLocale(object? obj)
{
var app = Application.Current;
if (app is null) return;
SemiTheme.OverrideLocaleResources(app, obj as CultureInfo);
}
[RelayCommand]
private static async Task OpenUrl(string url)
{
var launcher = ResolveDefaultTopLevel()?.Launcher;
if (launcher is not null)
{
await launcher.LaunchUriAsync(new Uri(url));
}
}
private static TopLevel? ResolveDefaultTopLevel()
{
return Application.Current?.ApplicationLifetime switch
{
IClassicDesktopStyleApplicationLifetime desktopLifetime => desktopLifetime.MainWindow,
ISingleViewApplicationLifetime singleView => TopLevel.GetTopLevel(singleView.MainView),
_ => null
};
}
}
public class MenuItemViewModel
{
public string? Header { get; set; }
public ICommand? Command { get; set; }
public object? CommandParameter { get; set; }
public IList<MenuItemViewModel>? Items { get; set; }
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 168 KiB

View File

@@ -2,6 +2,7 @@
<PropertyGroup> <PropertyGroup>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))"> <PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">

View File

@@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<AvaloniaVersion>12.0.1</AvaloniaVersion> <AvaloniaVersion>12.0.0</AvaloniaVersion>
<DataGridVersion>12.0.0</DataGridVersion> <DataGridVersion>12.0.0</DataGridVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -2,8 +2,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net8.0;net10.0</TargetFrameworks> <TargetFrameworks>net8.0;net10.0</TargetFrameworks>
<Version>12.0.1</Version> <Version>12.0.0</Version>
<PackageReleaseNotes>Update to Semi.Avalonia.ColorPicker 12.0.1</PackageReleaseNotes> <PackageReleaseNotes>Update to Semi.Avalonia.ColorPicker 12.0.0</PackageReleaseNotes>
<Title>Semi.Avalonia.ColorPicker</Title> <Title>Semi.Avalonia.ColorPicker</Title>
</PropertyGroup> </PropertyGroup>

View File

@@ -1,7 +1,8 @@
<ResourceDictionary <ResourceDictionary
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:collections="using:Avalonia.Collections"> xmlns:collections="using:Avalonia.Collections"
x:CompileBindings="True">
<ControlTheme x:Key="DataGridCellTextBlockTheme" TargetType="TextBlock"> <ControlTheme x:Key="DataGridCellTextBlockTheme" TargetType="TextBlock">
<Setter Property="Margin" Value="{DynamicResource DataGridCellTextBlockDefaultMargin}" /> <Setter Property="Margin" Value="{DynamicResource DataGridCellTextBlockDefaultMargin}" />
<Setter Property="VerticalAlignment" Value="Center" /> <Setter Property="VerticalAlignment" Value="Center" />

View File

@@ -1,7 +1,8 @@
<ResourceDictionary <ResourceDictionary
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls.TreeDataGrid"> xmlns:conv="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls.TreeDataGrid"
x:CompileBindings="True">
<Design.PreviewWith> <Design.PreviewWith>
<StackPanel Margin="20"> <StackPanel Margin="20">
<TreeDataGridColumnHeader Header="123" /> <TreeDataGridColumnHeader Header="123" />

View File

@@ -20,23 +20,27 @@
<!-- Compact-mode toggle: visible only in CompactOverlay/CompactInline. --> <!-- Compact-mode toggle: visible only in CompactOverlay/CompactInline. -->
<ToggleButton <ToggleButton
Name="PART_CompactPaneToggle" Name="PART_CompactPaneToggle"
DockPanel.Dock="Top"
AutomationProperties.Name="Toggle navigation drawer"
ToolTip.Tip="{DynamicResource STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER}"
Width="{DynamicResource ButtonDefaultHeight}" Width="{DynamicResource ButtonDefaultHeight}"
Height="{DynamicResource ButtonDefaultHeight}" Height="{DynamicResource ButtonDefaultHeight}"
HorizontalAlignment="Left" HorizontalAlignment="Left"
AutomationProperties.Name="Toggle navigation drawer"
Background="Transparent" Background="Transparent"
DockPanel.Dock="Top"
IsChecked="{Binding #PART_SplitView.IsPaneOpen, Mode=TwoWay}" IsChecked="{Binding #PART_SplitView.IsPaneOpen, Mode=TwoWay}"
IsVisible="False"> IsVisible="False"
ToolTip.Tip="Toggle navigation drawer">
<Panel> <Panel>
<PathIcon <PathIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="{DynamicResource DrawerPageMenuGlyph}" Data="{DynamicResource DrawerPageMenuGlyph}"
Foreground="{DynamicResource DrawerPagePaneButtonForeground}" Foreground="{DynamicResource DrawerPagePaneButtonForeground}"
IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNull}}" IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNull}}"
Theme="{DynamicResource InnerPathIcon}" /> Theme="{DynamicResource InnerPathIcon}" />
<ContentPresenter <ContentPresenter
Name="PART_CompactPaneIconPresenter" Name="PART_CompactPaneIconPresenter"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding DrawerIcon}" Content="{TemplateBinding DrawerIcon}"
ContentTemplate="{TemplateBinding DrawerIconTemplate}" ContentTemplate="{TemplateBinding DrawerIconTemplate}"
Foreground="{DynamicResource DrawerPagePaneButtonForeground}" Foreground="{DynamicResource DrawerPagePaneButtonForeground}"
@@ -45,105 +49,117 @@
</ToggleButton> </ToggleButton>
<ContentPresenter <ContentPresenter
Name="PART_DrawerHeader" Name="PART_DrawerHeader"
DockPanel.Dock="Top"
Background="{TemplateBinding DrawerHeaderBackground}" Background="{TemplateBinding DrawerHeaderBackground}"
Content="{TemplateBinding DrawerHeader}" Content="{TemplateBinding DrawerHeader}"
ContentTemplate="{TemplateBinding DrawerHeaderTemplate}" ContentTemplate="{TemplateBinding DrawerHeaderTemplate}"
IsVisible="{TemplateBinding DrawerHeader, Converter={x:Static ObjectConverters.IsNotNull}}" /> DockPanel.Dock="Top"
IsVisible="{TemplateBinding DrawerHeader,
Converter={x:Static ObjectConverters.IsNotNull}}" />
<ContentPresenter <ContentPresenter
Name="PART_DrawerFooter" Name="PART_DrawerFooter"
DockPanel.Dock="Bottom"
Background="{TemplateBinding DrawerFooterBackground}" Background="{TemplateBinding DrawerFooterBackground}"
Content="{TemplateBinding DrawerFooter}" Content="{TemplateBinding DrawerFooter}"
ContentTemplate="{TemplateBinding DrawerFooterTemplate}" ContentTemplate="{TemplateBinding DrawerFooterTemplate}"
IsVisible="{TemplateBinding DrawerFooter, Converter={x:Static ObjectConverters.IsNotNull}}" /> DockPanel.Dock="Bottom"
IsVisible="{TemplateBinding DrawerFooter,
Converter={x:Static ObjectConverters.IsNotNull}}" />
<ContentPresenter <ContentPresenter
Name="PART_DrawerPresenter" Name="PART_DrawerPresenter"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
Content="{TemplateBinding Drawer}" Content="{TemplateBinding Drawer}"
ContentTemplate="{TemplateBinding DrawerTemplate}" /> ContentTemplate="{TemplateBinding DrawerTemplate}" />
</DockPanel> </DockPanel>
</SplitView.Pane> </SplitView.Pane>
<Panel> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<DockPanel Name="PART_ContentDock"> <DockPanel Name="PART_ContentDock">
<Border <Border
Name="PART_TopBar" Name="PART_TopBar"
DockPanel.Dock="Top"
Height="{DynamicResource DrawerPageTopBarMinHeight}" Height="{DynamicResource DrawerPageTopBarMinHeight}"
Background="{DynamicResource DrawerPageTopBarBackground}"> Padding="5"
<DockPanel> Background="{DynamicResource DrawerPageTopBarBackground}"
DockPanel.Dock="Top">
<DockPanel HorizontalAlignment="Stretch">
<ToggleButton <ToggleButton
Name="PART_PaneButton" Name="PART_PaneButton"
DockPanel.Dock="Left"
AutomationProperties.Name="Toggle navigation drawer"
ToolTip.Tip="{DynamicResource STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER}"
Width="{DynamicResource ButtonDefaultHeight}" Width="{DynamicResource ButtonDefaultHeight}"
Height="{DynamicResource ButtonDefaultHeight}" Height="{DynamicResource ButtonDefaultHeight}"
AutomationProperties.Name="Toggle navigation drawer"
Background="Transparent" Background="Transparent"
IsChecked="{Binding #PART_SplitView.IsPaneOpen, Mode=TwoWay}"> DockPanel.Dock="Left"
IsChecked="{Binding #PART_SplitView.IsPaneOpen, Mode=TwoWay}"
ToolTip.Tip="Toggle navigation drawer">
<Panel> <Panel>
<PathIcon <PathIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="{DynamicResource DrawerPageMenuGlyph}" Data="{DynamicResource DrawerPageMenuGlyph}"
Foreground="{DynamicResource DrawerPagePaneButtonForeground}" Foreground="{DynamicResource DrawerPagePaneButtonForeground}"
IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNull}}" IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNull}}"
Theme="{DynamicResource InnerPathIcon}" /> Theme="{DynamicResource InnerPathIcon}" />
<ContentPresenter <ContentPresenter
Name="PART_PaneIconPresenter" Name="PART_PaneIconPresenter"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding DrawerIcon}" Content="{TemplateBinding DrawerIcon}"
ContentTemplate="{TemplateBinding DrawerIconTemplate}" ContentTemplate="{TemplateBinding DrawerIconTemplate}"
Foreground="{DynamicResource DrawerPagePaneButtonForeground}" Foreground="{DynamicResource DrawerPagePaneButtonForeground}"
IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNotNull}}" /> IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNotNull}}" />
</Panel> </Panel>
</ToggleButton> </ToggleButton>
<ContentPresenter <ContentControl
Name="PART_TitlePresenter" Name="PART_TitlePresenter"
Margin="{DynamicResource DrawerPageTitleMargin}" Margin="8,0,0,0"
VerticalAlignment="Center"
VerticalContentAlignment="Center" VerticalContentAlignment="Center"
Content="{TemplateBinding Header}" Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}" FontSize="16"
FontSize="{DynamicResource DrawerPageTitleFontSize}" FontWeight="SemiBold"
FontWeight="{DynamicResource DrawerPageTitleFontWeight}" IsVisible="{TemplateBinding Header,
IsVisible="{TemplateBinding Header, Converter={x:Static ObjectConverters.IsNotNull}}" /> Converter={x:Static ObjectConverters.IsNotNull}}" />
</DockPanel> </DockPanel>
</Border> </Border>
<Border <Border
Name="PART_BottomBar" Name="PART_BottomBar"
DockPanel.Dock="Bottom"
Height="{DynamicResource DrawerPageTopBarMinHeight}" Height="{DynamicResource DrawerPageTopBarMinHeight}"
Padding="5"
Background="{DynamicResource DrawerPageTopBarBackground}" Background="{DynamicResource DrawerPageTopBarBackground}"
DockPanel.Dock="Bottom"
IsVisible="False"> IsVisible="False">
<DockPanel> <DockPanel HorizontalAlignment="Stretch">
<ToggleButton <ToggleButton
Name="PART_BottomPaneButton" Name="PART_BottomPaneButton"
DockPanel.Dock="Left"
AutomationProperties.Name="Toggle navigation drawer" AutomationProperties.Name="Toggle navigation drawer"
ToolTip.Tip="{DynamicResource STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER}"
Width="{DynamicResource ButtonDefaultHeight}"
Height="{DynamicResource ButtonDefaultHeight}"
Background="Transparent" Background="Transparent"
IsChecked="{Binding #PART_SplitView.IsPaneOpen, Mode=TwoWay}"> DockPanel.Dock="Left"
IsChecked="{Binding #PART_SplitView.IsPaneOpen, Mode=TwoWay}"
ToolTip.Tip="Toggle navigation drawer">
<Panel> <Panel>
<PathIcon <PathIcon
Data="{DynamicResource DrawerPageMenuGlyph}" HorizontalAlignment="Center"
Foreground="{DynamicResource DrawerPagePaneButtonForeground}" VerticalAlignment="Center"
Data="{DynamicResource DrawerPaneButtonIcon}"
IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNull}}" IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNull}}"
Theme="{DynamicResource InnerPathIcon}" /> Theme="{DynamicResource InnerPathIcon}" />
<ContentPresenter <ContentPresenter
Name="PART_BottomPaneIconPresenter" Name="PART_BottomPaneIconPresenter"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding DrawerIcon}" Content="{TemplateBinding DrawerIcon}"
ContentTemplate="{TemplateBinding DrawerIconTemplate}" ContentTemplate="{TemplateBinding DrawerIconTemplate}"
Foreground="{DynamicResource DrawerPagePaneButtonForeground}"
IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNotNull}}" /> IsVisible="{TemplateBinding DrawerIcon, Converter={x:Static ObjectConverters.IsNotNull}}" />
</Panel> </Panel>
</ToggleButton> </ToggleButton>
<ContentPresenter <ContentControl
Name="PART_BottomTitlePresenter" Name="PART_BottomTitlePresenter"
Margin="{DynamicResource DrawerPageTitleMargin}" Margin="8,0,0,0"
VerticalAlignment="Center"
VerticalContentAlignment="Center" VerticalContentAlignment="Center"
Content="{TemplateBinding Header}" Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}" FontSize="16"
FontSize="{DynamicResource DrawerPageTitleFontSize}" FontWeight="SemiBold"
FontWeight="{DynamicResource DrawerPageTitleFontWeight}" IsVisible="{TemplateBinding Header,
IsVisible="{TemplateBinding Header, Converter={x:Static ObjectConverters.IsNotNull}}" /> Converter={x:Static ObjectConverters.IsNotNull}}" />
</DockPanel> </DockPanel>
</Border> </Border>
<ContentPresenter <ContentPresenter
@@ -162,7 +178,7 @@
Background="{TemplateBinding BackdropBrush}" Background="{TemplateBinding BackdropBrush}"
IsHitTestVisible="False" IsHitTestVisible="False"
IsVisible="False" /> IsVisible="False" />
</Panel> </Grid>
</SplitView> </SplitView>
</ControlTemplate> </ControlTemplate>
</Setter> </Setter>

View File

@@ -8,6 +8,26 @@
<ControlTheme x:Key="{x:Type NavigationPage}" TargetType="NavigationPage"> <ControlTheme x:Key="{x:Type NavigationPage}" TargetType="NavigationPage">
<Setter Property="Background" Value="Transparent" /> <Setter Property="Background" Value="Transparent" />
<Setter Property="BarHeight" Value="{DynamicResource NavigationPageBarMinHeight}" /> <Setter Property="BarHeight" Value="{DynamicResource NavigationPageBarMinHeight}" />
<Setter Property="PageTransition">
<PageSlide Duration="0:0:0.3" Orientation="Horizontal" FillMode="Forward">
<PageSlide.SlideInEasing>
<SplineEasing X1="0.16" Y1="1" X2="0.3" Y2="1" />
</PageSlide.SlideInEasing>
<PageSlide.SlideOutEasing>
<SplineEasing X1="0.2" Y1="0.85" X2="0.3" Y2="1" />
</PageSlide.SlideOutEasing>
</PageSlide>
</Setter>
<Setter Property="ModalTransition">
<PageSlide Duration="0:0:0.25" Orientation="Vertical" FillMode="Forward">
<PageSlide.SlideInEasing>
<SplineEasing X1="0.16" Y1="1" X2="0.3" Y2="1" />
</PageSlide.SlideInEasing>
<PageSlide.SlideOutEasing>
<SplineEasing X1="0.2" Y1="0.85" X2="0.3" Y2="1" />
</PageSlide.SlideOutEasing>
</PageSlide>
</Setter>
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate TargetType="NavigationPage"> <ControlTemplate TargetType="NavigationPage">
<Panel ClipToBounds="True"> <Panel ClipToBounds="True">

View File

@@ -1,6 +1,7 @@
<ResourceDictionary <ResourceDictionary
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True">
<ControlTheme x:Key="{x:Type SplitView}" TargetType="SplitView"> <ControlTheme x:Key="{x:Type SplitView}" TargetType="SplitView">
<Setter Property="OpenPaneLength" Value="{DynamicResource SplitViewOpenPaneThemeLength}" /> <Setter Property="OpenPaneLength" Value="{DynamicResource SplitViewOpenPaneThemeLength}" />
<Setter Property="CompactPaneLength" Value="{DynamicResource SplitViewCompactPaneThemeLength}" /> <Setter Property="CompactPaneLength" Value="{DynamicResource SplitViewCompactPaneThemeLength}" />

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Ausschneiden</x:String> <x:String x:Key="STRING_MENU_CUT">Ausschneiden</x:String>
<x:String x:Key="STRING_MENU_COPY">Kopieren</x:String> <x:String x:Key="STRING_MENU_COPY">Kopieren</x:String>
<x:String x:Key="STRING_MENU_PASTE">Einfügen</x:String> <x:String x:Key="STRING_MENU_PASTE">Einfügen</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Navigationsleiste umschalten</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Dateiname</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Dateiname</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Ausgeblendete Elemente anzeigen</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Ausgeblendete Elemente anzeigen</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Cut</x:String> <x:String x:Key="STRING_MENU_CUT">Cut</x:String>
<x:String x:Key="STRING_MENU_COPY">Copy</x:String> <x:String x:Key="STRING_MENU_COPY">Copy</x:String>
<x:String x:Key="STRING_MENU_PASTE">Paste</x:String> <x:String x:Key="STRING_MENU_PASTE">Paste</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Toggle navigation drawer</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">File name</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">File name</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Show hidden files</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Show hidden files</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Cut</x:String> <x:String x:Key="STRING_MENU_CUT">Cut</x:String>
<x:String x:Key="STRING_MENU_COPY">Copy</x:String> <x:String x:Key="STRING_MENU_COPY">Copy</x:String>
<x:String x:Key="STRING_MENU_PASTE">Paste</x:String> <x:String x:Key="STRING_MENU_PASTE">Paste</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Toggle navigation drawer</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">File name</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">File name</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Show hidden files</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Show hidden files</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Cortar</x:String> <x:String x:Key="STRING_MENU_CUT">Cortar</x:String>
<x:String x:Key="STRING_MENU_COPY">Copiar</x:String> <x:String x:Key="STRING_MENU_COPY">Copiar</x:String>
<x:String x:Key="STRING_MENU_PASTE">Pegar</x:String> <x:String x:Key="STRING_MENU_PASTE">Pegar</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Alternar panel de navegación</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Nombre de fichero</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Nombre de fichero</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Mostrar ficheros ocultos</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Mostrar ficheros ocultos</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Couper</x:String> <x:String x:Key="STRING_MENU_CUT">Couper</x:String>
<x:String x:Key="STRING_MENU_COPY">Copier</x:String> <x:String x:Key="STRING_MENU_COPY">Copier</x:String>
<x:String x:Key="STRING_MENU_PASTE">Coller</x:String> <x:String x:Key="STRING_MENU_PASTE">Coller</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Basculer le volet de navigation</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Nom du fichier</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Nom du fichier</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Afficher les fichiers cachés</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Afficher les fichiers cachés</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Taglia</x:String> <x:String x:Key="STRING_MENU_CUT">Taglia</x:String>
<x:String x:Key="STRING_MENU_COPY">Copia</x:String> <x:String x:Key="STRING_MENU_COPY">Copia</x:String>
<x:String x:Key="STRING_MENU_PASTE">Incolla</x:String> <x:String x:Key="STRING_MENU_PASTE">Incolla</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Attiva/disattiva riquadro di navigazione</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Nome file</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Nome file</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Mostra file nascosti</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Mostra file nascosti</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Taglia</x:String> <x:String x:Key="STRING_MENU_CUT">Taglia</x:String>
<x:String x:Key="STRING_MENU_COPY">Copia</x:String> <x:String x:Key="STRING_MENU_COPY">Copia</x:String>
<x:String x:Key="STRING_MENU_PASTE">Incolla</x:String> <x:String x:Key="STRING_MENU_PASTE">Incolla</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Attiva/disattiva riquadro di navigazione</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Nome file</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Nome file</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Mostra file nascosti</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Mostra file nascosti</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">切り取り</x:String> <x:String x:Key="STRING_MENU_CUT">切り取り</x:String>
<x:String x:Key="STRING_MENU_COPY">コピー</x:String> <x:String x:Key="STRING_MENU_COPY">コピー</x:String>
<x:String x:Key="STRING_MENU_PASTE">貼り付け</x:String> <x:String x:Key="STRING_MENU_PASTE">貼り付け</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">ナビゲーション ドロワーを切り替える</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">ファイル名</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">ファイル名</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">隠しファイルを表示</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">隠しファイルを表示</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">잘라내기</x:String> <x:String x:Key="STRING_MENU_CUT">잘라내기</x:String>
<x:String x:Key="STRING_MENU_COPY">복사</x:String> <x:String x:Key="STRING_MENU_COPY">복사</x:String>
<x:String x:Key="STRING_MENU_PASTE">붙여넣기</x:String> <x:String x:Key="STRING_MENU_PASTE">붙여넣기</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">탐색 창 전환</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">파일 이름</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">파일 이름</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">숨긴 파일 표시</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">숨긴 파일 표시</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Knippen</x:String> <x:String x:Key="STRING_MENU_CUT">Knippen</x:String>
<x:String x:Key="STRING_MENU_COPY">Kopiëren</x:String> <x:String x:Key="STRING_MENU_COPY">Kopiëren</x:String>
<x:String x:Key="STRING_MENU_PASTE">Plakken</x:String> <x:String x:Key="STRING_MENU_PASTE">Plakken</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Navigatievenster openen of sluiten</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Bestandsnaam</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Bestandsnaam</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Toon verborgen bestanden</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Toon verborgen bestanden</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Knippen</x:String> <x:String x:Key="STRING_MENU_CUT">Knippen</x:String>
<x:String x:Key="STRING_MENU_COPY">Kopiëren</x:String> <x:String x:Key="STRING_MENU_COPY">Kopiëren</x:String>
<x:String x:Key="STRING_MENU_PASTE">Plakken</x:String> <x:String x:Key="STRING_MENU_PASTE">Plakken</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Navigatievenster openen of sluiten</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Bestandsnaam</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Bestandsnaam</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Toon verborgen bestanden</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Toon verborgen bestanden</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Wytnij</x:String> <x:String x:Key="STRING_MENU_CUT">Wytnij</x:String>
<x:String x:Key="STRING_MENU_COPY">Kopiuj</x:String> <x:String x:Key="STRING_MENU_COPY">Kopiuj</x:String>
<x:String x:Key="STRING_MENU_PASTE">Wklej</x:String> <x:String x:Key="STRING_MENU_PASTE">Wklej</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Przełącz panel nawigacyjny</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Nazwa pliku</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Nazwa pliku</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Pokaż ukryte pliki</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Pokaż ukryte pliki</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Вырезать</x:String> <x:String x:Key="STRING_MENU_CUT">Вырезать</x:String>
<x:String x:Key="STRING_MENU_COPY">Копировать</x:String> <x:String x:Key="STRING_MENU_COPY">Копировать</x:String>
<x:String x:Key="STRING_MENU_PASTE">Вставить</x:String> <x:String x:Key="STRING_MENU_PASTE">Вставить</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Переключить панель навигации</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Имя файла</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Имя файла</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Показать скрытые файлы</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Показать скрытые файлы</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">Вирізати</x:String> <x:String x:Key="STRING_MENU_CUT">Вирізати</x:String>
<x:String x:Key="STRING_MENU_COPY">Копіювати</x:String> <x:String x:Key="STRING_MENU_COPY">Копіювати</x:String>
<x:String x:Key="STRING_MENU_PASTE">Вставити</x:String> <x:String x:Key="STRING_MENU_PASTE">Вставити</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">Перемкнути панель навігації</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">Ім'я файлу</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">Ім'я файлу</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Показати приховані папки</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Показати приховані папки</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">剪切</x:String> <x:String x:Key="STRING_MENU_CUT">剪切</x:String>
<x:String x:Key="STRING_MENU_COPY">复制</x:String> <x:String x:Key="STRING_MENU_COPY">复制</x:String>
<x:String x:Key="STRING_MENU_PASTE">粘贴</x:String> <x:String x:Key="STRING_MENU_PASTE">粘贴</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">切换导航抽屉</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">文件名</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">文件名</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">显示隐藏文件</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">显示隐藏文件</x:String>

View File

@@ -14,8 +14,6 @@
<x:String x:Key="STRING_MENU_CUT">剪下</x:String> <x:String x:Key="STRING_MENU_CUT">剪下</x:String>
<x:String x:Key="STRING_MENU_COPY">複製</x:String> <x:String x:Key="STRING_MENU_COPY">複製</x:String>
<x:String x:Key="STRING_MENU_PASTE">貼上</x:String> <x:String x:Key="STRING_MENU_PASTE">貼上</x:String>
<!-- DrawerPage -->
<x:String x:Key="STRING_DRAWERPAGE_TOGGLE_NAVIGATION_DRAWER">切換導覽抽屜</x:String>
<!-- ManagedFileChooser --> <!-- ManagedFileChooser -->
<x:String x:Key="STRING_CHOOSER_FILE_NAME">檔案名</x:String> <x:String x:Key="STRING_CHOOSER_FILE_NAME">檔案名</x:String>
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">顯示隱藏檔案</x:String> <x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">顯示隱藏檔案</x:String>

View File

@@ -2,8 +2,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net8.0;net10.0</TargetFrameworks> <TargetFrameworks>net8.0;net10.0</TargetFrameworks>
<Version>12.0.1</Version> <Version>12.0.0</Version>
<PackageReleaseNotes>Update to Semi.Avalonia 12.0.1</PackageReleaseNotes> <PackageReleaseNotes>Update to Semi.Avalonia 12.0.0</PackageReleaseNotes>
<Title>Semi.Avalonia</Title> <Title>Semi.Avalonia</Title>
</PropertyGroup> </PropertyGroup>

View File

@@ -4,8 +4,4 @@
<!-- DrawerPage pane button --> <!-- DrawerPage pane button -->
<StaticResource x:Key="DrawerPageMenuGlyph" ResourceKey="SemiIconMenu" /> <StaticResource x:Key="DrawerPageMenuGlyph" ResourceKey="SemiIconMenu" />
<StaticResource x:Key="DrawerPageTitleFontSize" ResourceKey="SemiFontSizeHeader6" />
<StaticResource x:Key="DrawerPageTitleFontWeight" ResourceKey="SemiFontWeightBold" />
<Thickness x:Key="DrawerPageTitleMargin">8 0 0 0</Thickness>
</ResourceDictionary> </ResourceDictionary>