diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7b363cb..bcc040c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup dotnet uses: actions/setup-dotnet@v5 @@ -32,7 +32,7 @@ jobs: run: touch $OUTPUT_PATH/.nojekyll - name: Commit wwwroot to GitHub Pages - uses: JamesIves/github-pages-deploy-action@v4.5.0 + uses: JamesIves/github-pages-deploy-action@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages diff --git a/.github/workflows/pack-nightly.yml b/.github/workflows/pack-nightly.yml index 2e82c13..40a9554 100644 --- a/.github/workflows/pack-nightly.yml +++ b/.github/workflows/pack-nightly.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Get Version run: | @@ -62,7 +62,7 @@ jobs: run: dotnet nuget push "nugets/*.nupkg" --api-key ${{ secrets.IRIHI_NUGET_API_KEY }} --source irihi.tech --skip-duplicate - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: nugets path: nugets diff --git a/.github/workflows/pack.yml b/.github/workflows/pack.yml index 4d8d8f2..d68411c 100644 --- a/.github/workflows/pack.yml +++ b/.github/workflows/pack.yml @@ -47,7 +47,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Pack Semi.Avalonia if: ${{ inputs.Semi_Avalonia }} @@ -70,7 +70,7 @@ jobs: run: dotnet nuget push "nugets/*.nupkg" --api-key ${{ secrets.NUGET_ORG_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: nugets path: nugets diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ee4062e..51e3b14 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -75,11 +75,11 @@ jobs: runs-on: windows-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Publish win-x64 run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r win-x64 -c Release -o publish --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Desktop.win-x64 path: | @@ -91,13 +91,13 @@ jobs: runs-on: windows-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Enable Native AOT in .csproj run: sed -i 's##true#' demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj - name: Publish win-x64 AOT run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r win-x64 -c Release -o publish - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Desktop.win-x64.NativeAOT path: | @@ -109,11 +109,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Publish linux-x64 run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r linux-x64 -c Release -o publish --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Desktop.linux-x64 path: | @@ -125,13 +125,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Enable Native AOT in .csproj run: sed -i 's##true#' demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj - name: Publish linux-x64 AOT run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r linux-x64 -c Release -o publish - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Desktop.linux-x64.NativeAOT path: | @@ -143,11 +143,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Publish linux-x64 DRM run: dotnet publish demo/Semi.Avalonia.Demo.Drm -r linux-x64 -c Release -o publish --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Drm.linux-x64 path: | @@ -159,13 +159,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Enable Native AOT in .csproj run: sed -i 's##true#' demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj - name: Publish linux-x64 AOT run: dotnet publish demo/Semi.Avalonia.Demo.Drm -r linux-x64 -c Release -o publish - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Drm.linux-x64.NativeAOT path: | @@ -177,11 +177,11 @@ jobs: runs-on: macos-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Publish osx-arm64 run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r osx-arm64 -c Release -o publish --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Desktop.osx-arm64 path: | @@ -193,13 +193,13 @@ jobs: runs-on: macos-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Enable Native AOT in .csproj run: sed -i '' 's##true#' demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj - name: Publish osx-arm64 AOT run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r osx-arm64 -c Release -o publish - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: Semi.Avalonia.Demo.Desktop.osx-arm64.NativeAOT path: | @@ -211,7 +211,7 @@ jobs: runs-on: windows-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install Android workload run: dotnet workload install android - name: Restore Dependencies @@ -219,7 +219,7 @@ jobs: - name: Publish Android run: dotnet publish demo/Semi.Avalonia.Demo.Android -c Release -f net10.0-android --no-restore -o publish /p:RuntimeIdentifier=android-arm64 - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7 with: name: android-arm64 path: publish/*Signed.apk diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml index 36c5a97..8775683 100644 --- a/.github/workflows/release-tag.yml +++ b/.github/workflows/release-tag.yml @@ -41,7 +41,7 @@ jobs: needs: [ nuget,publish ] runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v4.3.0 + - uses: actions/download-artifact@v8 - name: Display structure of downloaded files run: ls -R @@ -62,7 +62,7 @@ jobs: run: ls -R - name: Release - uses: softprops/action-gh-release@v2.3.2 + uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' with: generate_release_notes: true diff --git a/Nuget.Config b/Nuget.Config new file mode 100644 index 0000000..0b58b3c --- /dev/null +++ b/Nuget.Config @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo/Directory.Packages.props b/demo/Directory.Packages.props index 7a071fa..500b78f 100644 --- a/demo/Directory.Packages.props +++ b/demo/Directory.Packages.props @@ -1,13 +1,12 @@  true - 11.3.11 - 11.3.11 - 3.119.1 + 12.0.0-rc2 + 12.0.0-rc2 + 3.119.3-preview.1.1 - @@ -15,13 +14,13 @@ + - + - - + \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo.Android/Application.cs b/demo/Semi.Avalonia.Demo.Android/Application.cs new file mode 100644 index 0000000..611e568 --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Android/Application.cs @@ -0,0 +1,20 @@ +using Android.App; +using Android.Runtime; +using Avalonia; +using Avalonia.Android; + +namespace Semi.Avalonia.Demo.Android; + +[Application] +public class Application : AvaloniaAndroidApplication +{ + protected Application(nint javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) + { + } + + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithSourceHanSansCNFont(); + } +} \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo.Android/MainActivity.cs b/demo/Semi.Avalonia.Demo.Android/MainActivity.cs index 012a48d..0bf0b35 100644 --- a/demo/Semi.Avalonia.Demo.Android/MainActivity.cs +++ b/demo/Semi.Avalonia.Demo.Android/MainActivity.cs @@ -1,6 +1,5 @@ using Android.App; using Android.Content.PM; -using Avalonia; using Avalonia.Android; namespace Semi.Avalonia.Demo.Android; @@ -12,11 +11,4 @@ namespace Semi.Avalonia.Demo.Android; MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)] -public class MainActivity : AvaloniaMainActivity -{ - protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) - { - return base.CustomizeAppBuilder(builder) - .WithSourceHanSansCNFont(); - } -} \ No newline at end of file +public class MainActivity : AvaloniaMainActivity; \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj b/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj index ef02e0c..c65aded 100644 --- a/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj +++ b/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj @@ -2,7 +2,7 @@ Exe net10.0-android - 21 + 23 enable com.irihitech.Semi.Avalonia 1 @@ -13,6 +13,12 @@ Semi.Avalonia.Demo.Android + + + false + true + + diff --git a/demo/Semi.Avalonia.Demo/App.axaml b/demo/Semi.Avalonia.Demo/App.axaml index 99f40c7..76a705d 100644 --- a/demo/Semi.Avalonia.Demo/App.axaml +++ b/demo/Semi.Avalonia.Demo/App.axaml @@ -11,7 +11,7 @@ - + diff --git a/demo/Semi.Avalonia.Demo/App.axaml.cs b/demo/Semi.Avalonia.Demo/App.axaml.cs index 5a67b89..b617ffe 100644 --- a/demo/Semi.Avalonia.Demo/App.axaml.cs +++ b/demo/Semi.Avalonia.Demo/App.axaml.cs @@ -12,6 +12,9 @@ public partial class App : Application public override void Initialize() { AvaloniaXamlLoader.Load(this); +#if DEBUG + this.AttachDeveloperTools(); +#endif this.DataContext = new ApplicationViewModel(); } @@ -22,7 +25,7 @@ public partial class App : Application case IClassicDesktopStyleApplicationLifetime desktop: // Line below is needed to remove Avalonia data validation. // Without this line you will get duplicate validations from both Avalonia and CT - BindingPlugins.DataValidators.RemoveAt(0); + // BindingPlugins.DataValidators.RemoveAt(0); desktop.MainWindow = new MainWindow(); break; case ISingleViewApplicationLifetime singleView: diff --git a/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs b/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs index 06a2ce8..c2ac11e 100644 --- a/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs +++ b/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; +using Avalonia.Input.Platform; using Avalonia.Media; using Semi.Avalonia.Demo.Converters; diff --git a/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml index 614efa4..f2afbb7 100644 --- a/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/AutoCompleteBoxDemo.axaml @@ -28,7 +28,7 @@ @@ -69,12 +69,12 @@ + + + + + + \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml index 4730e62..83f4f0a 100644 --- a/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml @@ -33,6 +33,6 @@ Margin="0,0,0,8" CustomDateFormatString="ddd, MMM d" SelectedDateFormat="Custom" /> - + \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo/Pages/CarouselPageDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/CarouselPageDemo.axaml new file mode 100644 index 0000000..d736ef0 --- /dev/null +++ b/demo/Semi.Avalonia.Demo/Pages/CarouselPageDemo.axaml @@ -0,0 +1,69 @@ + + + + + + + + + - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Semi.Avalonia/Controls/Carousel.axaml b/src/Semi.Avalonia/Controls/Carousel.axaml index 9401301..8bf031b 100644 --- a/src/Semi.Avalonia/Controls/Carousel.axaml +++ b/src/Semi.Avalonia/Controls/Carousel.axaml @@ -1,7 +1,7 @@ + xmlns:semi="https://irihi.tech/semi"> @@ -156,7 +156,7 @@ Theme="{DynamicResource InnerPathIcon}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" - Data="{DynamicResource CarouselButtonGlyph}" + Data="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" /> @@ -197,8 +197,8 @@ HorizontalAlignment="Center" VerticalAlignment="Center" ItemContainerTheme="{DynamicResource CarouselIndicatorDotListBoxItem}" - ItemsSource="{TemplateBinding ItemCount, Converter={x:Static converter:ItemConverter.ItemToObjectConverter}}" - IsVisible="{TemplateBinding ItemCount, Converter={x:Static converter:ItemConverter.ItemVisibleConverter}}" + ItemsSource="{TemplateBinding ItemCount, Converter={x:Static semi:ItemConverter.ItemToObjectConverter}}" + IsVisible="{TemplateBinding ItemCount, Converter={x:Static semi:ItemConverter.ItemVisibleConverter}}" SelectedIndex="{TemplateBinding SelectedIndex, Mode=TwoWay}"> @@ -213,7 +213,8 @@ Theme="{DynamicResource CarouselButton}" Margin="{DynamicResource CarouselButtonMargin}" Foreground="{DynamicResource CarouselButtonForeground}" - IsVisible="{TemplateBinding ItemCount, Converter={x:Static converter:ItemConverter.ItemVisibleConverter}}" + Content="{StaticResource SemiIconChevronLeft}" + IsVisible="{TemplateBinding ItemCount, Converter={x:Static semi:ItemConverter.ItemVisibleConverter}}" Command="{Binding $parent[Carousel].Previous}" /> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Semi.Avalonia/Controls/NumericUpDown.axaml b/src/Semi.Avalonia/Controls/NumericUpDown.axaml index 4686973..26743bf 100644 --- a/src/Semi.Avalonia/Controls/NumericUpDown.axaml +++ b/src/Semi.Avalonia/Controls/NumericUpDown.axaml @@ -6,6 +6,7 @@ + @@ -38,7 +39,8 @@ Theme="{DynamicResource NonErrorTextBox}" InnerLeftContent="{TemplateBinding InnerLeftContent}" InnerRightContent="{TemplateBinding InnerRightContent}" - Watermark="{TemplateBinding Watermark}" /> + PlaceholderForeground="{TemplateBinding PlaceholderForeground}" + PlaceholderText="{TemplateBinding PlaceholderText}" /> @@ -50,6 +52,15 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + diff --git a/src/Semi.Avalonia/Controls/SplitView.axaml b/src/Semi.Avalonia/Controls/SplitView.axaml index 05e31a8..0b2e56e 100644 --- a/src/Semi.Avalonia/Controls/SplitView.axaml +++ b/src/Semi.Avalonia/Controls/SplitView.axaml @@ -1,4 +1,7 @@ - + @@ -49,7 +52,7 @@ diff --git a/src/Semi.Avalonia/Controls/TabControl.axaml b/src/Semi.Avalonia/Controls/TabControl.axaml index cbbd7e7..5094acf 100644 --- a/src/Semi.Avalonia/Controls/TabControl.axaml +++ b/src/Semi.Avalonia/Controls/TabControl.axaml @@ -36,13 +36,19 @@ ItemsPanel="{TemplateBinding ItemsPanel}" /> - + + + + @@ -149,13 +155,19 @@ Name="PART_ItemsPresenter" ItemsPanel="{TemplateBinding ItemsPanel}" /> - + + + + @@ -200,13 +212,19 @@ - + + + + @@ -335,13 +353,19 @@ ItemsPanel="{TemplateBinding ItemsPanel}" /> - + + + + diff --git a/src/Semi.Avalonia/Controls/TabItem.axaml b/src/Semi.Avalonia/Controls/TabItem.axaml index e0fce6b..1f721c0 100644 --- a/src/Semi.Avalonia/Controls/TabItem.axaml +++ b/src/Semi.Avalonia/Controls/TabItem.axaml @@ -6,16 +6,12 @@ Width="400" Height="400" Margin="20"> + - - - - - - - - - + + + + @@ -25,20 +21,39 @@ - + CornerRadius="{TemplateBinding CornerRadius}"> + + + + + + + + + + + @@ -46,17 +61,31 @@ - + + + + + - - @@ -98,27 +127,27 @@ x:Key="LineTabItem" BasedOn="{StaticResource BaseTabItem}" TargetType="TabItem"> - - - @@ -150,15 +179,15 @@ TargetType="TabItem"> - - @@ -207,16 +236,20 @@ TargetType="TabItem"> - + - diff --git a/src/Semi.Avalonia/Controls/TabbedPage.axaml b/src/Semi.Avalonia/Controls/TabbedPage.axaml new file mode 100644 index 0000000..64b68b7 --- /dev/null +++ b/src/Semi.Avalonia/Controls/TabbedPage.axaml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Semi.Avalonia/Controls/TextBox.axaml b/src/Semi.Avalonia/Controls/TextBox.axaml index f76022e..36243fa 100644 --- a/src/Semi.Avalonia/Controls/TextBox.axaml +++ b/src/Semi.Avalonia/Controls/TextBox.axaml @@ -22,8 +22,30 @@ IsEnabled="{Binding $parent[TextBox].CanPaste}" /> + + + + + + + @@ -67,11 +89,11 @@ VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"> @@ -133,6 +155,10 @@ + + + + diff --git a/src/Semi.Avalonia/Controls/TitleBar.axaml b/src/Semi.Avalonia/Controls/TitleBar.axaml deleted file mode 100644 index 2755724..0000000 --- a/src/Semi.Avalonia/Controls/TitleBar.axaml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Semi.Avalonia/Controls/TreeView.axaml b/src/Semi.Avalonia/Controls/TreeView.axaml index 11488a8..c086004 100644 --- a/src/Semi.Avalonia/Controls/TreeView.axaml +++ b/src/Semi.Avalonia/Controls/TreeView.axaml @@ -1,7 +1,7 @@ + xmlns:converters="using:Avalonia.Controls.Converters"> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +