mirror of
https://gitcode.com/gh_mirrors/se/Semi.Avalonia
synced 2026-04-15 21:56:36 +08:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0d7a46e50 | ||
|
|
d1b862ef85 | ||
|
|
0e9dbdd528 |
2
.github/workflows/release-tag.yml
vendored
2
.github/workflows/release-tag.yml
vendored
@@ -63,7 +63,7 @@ jobs:
|
||||
run: ls -R
|
||||
|
||||
- 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'
|
||||
with:
|
||||
generate_release_notes: true
|
||||
|
||||
28
demo/Semi.Avalonia.Demo/Converters/FileIconConverter.cs
Normal file
28
demo/Semi.Avalonia.Demo/Converters/FileIconConverter.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -29,40 +29,40 @@
|
||||
|
||||
<AutoCompleteBox
|
||||
PlaceholderText="Please select a State"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
Classes="Large"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
Classes="Small"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
Classes="Bordered"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
IsEnabled="False"
|
||||
PlaceholderText="Disabled"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
InnerLeftContent="https://"
|
||||
InnerRightContent=".com"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<AutoCompleteBox
|
||||
Width="100"
|
||||
Classes="Large"
|
||||
PlaceholderText="Large"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
Width="100"
|
||||
PlaceholderText="Default"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
Width="100"
|
||||
Classes="Small"
|
||||
PlaceholderText="Small"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal">
|
||||
@@ -70,17 +70,17 @@
|
||||
Width="100"
|
||||
IsEnabled="False"
|
||||
PlaceholderText="Disabled"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
Width="100"
|
||||
Classes="Bordered"
|
||||
PlaceholderText="Bordered"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
<AutoCompleteBox
|
||||
Width="100"
|
||||
Classes="Bordered"
|
||||
IsEnabled="False"
|
||||
ValueMemberBinding="{Binding Name,x:DataType=vm:StateData}" />
|
||||
ValueMemberBinding="{Binding Name,DataType=vm:StateData}" />
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<ScrollViewer DockPanel.Dock="Right" Width="260">
|
||||
<StackPanel Margin="12" Spacing="8">
|
||||
<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"
|
||||
HorizontalAlignment="Stretch"
|
||||
@@ -26,6 +26,20 @@
|
||||
|
||||
<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" />
|
||||
|
||||
<CheckBox Name="HasNavBarCheck"
|
||||
@@ -35,20 +49,38 @@
|
||||
<CheckBox Name="HasBackButtonCheck"
|
||||
Content="Has Back Button"
|
||||
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 />
|
||||
|
||||
<TextBlock Text="Status" FontWeight="SemiBold" FontSize="14" />
|
||||
<TextBlock Name="StatusText"
|
||||
Text="Depth: 1"
|
||||
Opacity="0.7"
|
||||
TextWrapping="Wrap" />
|
||||
<TextBlock Name="HeaderText"
|
||||
Text="Current: Home"
|
||||
Opacity="0.7"
|
||||
TextWrapping="Wrap" />
|
||||
<ToggleSwitch Content="Large" Name="large" />
|
||||
<TextBlock Name="ModalText"
|
||||
Text="Modals: 0"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
using System;
|
||||
using Avalonia.Animation;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
|
||||
@@ -6,6 +8,7 @@ namespace Semi.Avalonia.Demo.Pages;
|
||||
public partial class NavigationPageDemo : UserControl
|
||||
{
|
||||
private int _pageCount;
|
||||
private int _modalCount;
|
||||
|
||||
public NavigationPageDemo()
|
||||
{
|
||||
@@ -15,7 +18,7 @@ public partial class NavigationPageDemo : UserControl
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -42,6 +45,27 @@ public partial class NavigationPageDemo : UserControl
|
||||
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)
|
||||
{
|
||||
if (DemoNav == null)
|
||||
@@ -50,7 +74,7 @@ public partial class NavigationPageDemo : UserControl
|
||||
NavigationPage.SetHasNavigationBar(DemoNav.CurrentPage, HasNavBarCheck.IsChecked == true);
|
||||
}
|
||||
|
||||
private void OnHasBackButonChanged(object? sender, RoutedEventArgs e)
|
||||
private void OnHasBackButtonChanged(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
if (DemoNav == null)
|
||||
return;
|
||||
@@ -58,9 +82,30 @@ public partial class NavigationPageDemo : UserControl
|
||||
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()
|
||||
{
|
||||
StatusText.Text = $"Depth: {DemoNav.StackDepth}";
|
||||
HeaderText.Text = $"Current: {DemoNav.CurrentPage?.Header ?? "(none)"}";
|
||||
ModalText.Text = $"Modals: {DemoNav.ModalStack.Count}";
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,8 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
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
|
||||
Spacing="10"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Nullable>enable</Nullable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<ResourceDictionary
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
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">
|
||||
<Setter Property="Margin" Value="{DynamicResource DataGridCellTextBlockDefaultMargin}" />
|
||||
<Setter Property="VerticalAlignment" Value="Center" />
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<ResourceDictionary
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
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>
|
||||
<StackPanel Margin="20">
|
||||
<TreeDataGridColumnHeader Header="123" />
|
||||
|
||||
@@ -8,6 +8,26 @@
|
||||
<ControlTheme x:Key="{x:Type NavigationPage}" TargetType="NavigationPage">
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<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">
|
||||
<ControlTemplate TargetType="NavigationPage">
|
||||
<Panel ClipToBounds="True">
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<ResourceDictionary
|
||||
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">
|
||||
<Setter Property="OpenPaneLength" Value="{DynamicResource SplitViewOpenPaneThemeLength}" />
|
||||
<Setter Property="CompactPaneLength" Value="{DynamicResource SplitViewCompactPaneThemeLength}" />
|
||||
|
||||
Reference in New Issue
Block a user