diff --git a/src/Ursa.Themes.Semi/Controls/DualBadge.axaml b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml
index 4cfb62f..af0c658 100644
--- a/src/Ursa.Themes.Semi/Controls/DualBadge.axaml
+++ b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml
@@ -1,7 +1,8 @@
+ xmlns:u="https://irihi.tech/ursa"
+ xmlns:converters="clr-namespace:Ursa.Converters;assembly=Ursa">
@@ -30,10 +31,9 @@
Name="{x:Static u:DualBadge.PART_Icon}"
Width="14"
Height="14"
- Margin="2 0 0 0"
IsVisible="{TemplateBinding Icon,Converter={x:Static ObjectConverters.IsNotNull}}"
Foreground="{TemplateBinding IconForeground}"
- Padding="{TemplateBinding Padding}"
+ Margin="{TemplateBinding Padding, Converter={x:Static converters:ThicknessExcludeConverter.Right}}"
Content="{TemplateBinding Icon}"
ContentTemplate="{TemplateBinding IconTemplate}" />
@@ -84,7 +84,6 @@
BasedOn="{StaticResource {x:Type u:DualBadge}}"
TargetType="u:DualBadge">
-
-
+
\ No newline at end of file
diff --git a/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj b/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj
index 5bb0d73..88fc18f 100644
--- a/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj
+++ b/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj
@@ -1,6 +1,6 @@
-
+
netstandard2.0
@@ -13,11 +13,11 @@
-
+
-
+
diff --git a/src/Ursa/Converters/CornerRadiusConverter.cs b/src/Ursa/Converters/CornerRadiusConverter.cs
new file mode 100644
index 0000000..a5e041a
--- /dev/null
+++ b/src/Ursa/Converters/CornerRadiusConverter.cs
@@ -0,0 +1,90 @@
+using System.Globalization;
+using Avalonia;
+using Avalonia.Data.Converters;
+
+namespace Ursa.Converters;
+
+[Flags]
+public enum CornerRadiusPosition
+{
+ TopLeft = 1,
+ TopRight = 2,
+ BottomLeft = 4,
+ BottomRight = 8,
+ Top = 3,
+ Left = 5,
+ Right = 10,
+ Bottom = 12,
+}
+
+public class CornerRadiusIncludeConverter: IValueConverter
+{
+ public static CornerRadiusIncludeConverter TopLeft { get; } = new( CornerRadiusPosition.TopLeft );
+ public static CornerRadiusIncludeConverter TopRight { get; } = new( CornerRadiusPosition.TopRight );
+ public static CornerRadiusIncludeConverter BottomLeft { get; } = new( CornerRadiusPosition.BottomLeft );
+ public static CornerRadiusIncludeConverter BottomRight { get; } = new( CornerRadiusPosition.BottomRight );
+ public static CornerRadiusIncludeConverter Top { get; } = new( CornerRadiusPosition.Top );
+ public static CornerRadiusIncludeConverter Left { get; } = new( CornerRadiusPosition.Left );
+ public static CornerRadiusIncludeConverter Right { get; } = new( CornerRadiusPosition.Right );
+ public static CornerRadiusIncludeConverter Bottom { get; } = new( CornerRadiusPosition.Bottom );
+
+ private readonly CornerRadiusPosition _position;
+
+ public CornerRadiusIncludeConverter(CornerRadiusPosition position)
+ {
+ _position = position;
+ }
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (value is CornerRadius r)
+ {
+ double topLeft = _position.HasFlag(CornerRadiusPosition.TopLeft) ? r.TopLeft : 0;
+ double topRight = _position.HasFlag(CornerRadiusPosition.TopRight) ? r.TopRight : 0;
+ double bottomLeft = _position.HasFlag(CornerRadiusPosition.BottomLeft) ? r.BottomLeft : 0;
+ double bottomRight = _position.HasFlag(CornerRadiusPosition.BottomRight) ? r.BottomRight : 0;
+ return new CornerRadius(topLeft, topRight, bottomRight, bottomLeft);
+ }
+ return AvaloniaProperty.UnsetValue;
+ }
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+}
+
+public class CornerRadiusExcludeConverter : IValueConverter
+{
+ public static CornerRadiusExcludeConverter TopLeft { get; } = new( CornerRadiusPosition.TopLeft );
+ public static CornerRadiusExcludeConverter TopRight { get; } = new( CornerRadiusPosition.TopRight );
+ public static CornerRadiusExcludeConverter BottomLeft { get; } = new( CornerRadiusPosition.BottomLeft );
+ public static CornerRadiusExcludeConverter BottomRight { get; } = new( CornerRadiusPosition.BottomRight );
+ public static CornerRadiusExcludeConverter Top { get; } = new( CornerRadiusPosition.Top );
+ public static CornerRadiusExcludeConverter Left { get; } = new( CornerRadiusPosition.Left );
+ public static CornerRadiusExcludeConverter Right { get; } = new( CornerRadiusPosition.Right );
+ public static CornerRadiusExcludeConverter Bottom { get; } = new( CornerRadiusPosition.Bottom );
+
+ private readonly CornerRadiusPosition _position;
+
+ public CornerRadiusExcludeConverter(CornerRadiusPosition position)
+ {
+ _position = position;
+ }
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (value is CornerRadius r)
+ {
+ double topLeft = _position.HasFlag(CornerRadiusPosition.TopLeft) ? 0 : r.TopLeft;
+ double topRight = _position.HasFlag(CornerRadiusPosition.TopRight) ? 0 : r.TopRight;
+ double bottomLeft = _position.HasFlag(CornerRadiusPosition.BottomLeft) ? 0 : r.BottomLeft;
+ double bottomRight = _position.HasFlag(CornerRadiusPosition.BottomRight) ? 0 : r.BottomRight;
+ return new CornerRadius(topLeft, topRight, bottomRight, bottomLeft);
+ }
+ return AvaloniaProperty.UnsetValue;
+ }
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/src/Ursa/Converters/ThicknessConverter.cs b/src/Ursa/Converters/ThicknessConverter.cs
new file mode 100644
index 0000000..6073cf0
--- /dev/null
+++ b/src/Ursa/Converters/ThicknessConverter.cs
@@ -0,0 +1,91 @@
+using System.Globalization;
+using Avalonia;
+using Avalonia.Data.Converters;
+
+namespace Ursa.Converters;
+
+[Flags]
+public enum ThicknessPosition
+{
+ Left = 1,
+ Top = 2,
+ Right = 4,
+ Bottom = 8,
+ TopLeft = 3,
+ TopRight = 6,
+ BottomLeft = 9,
+ BottomRight = 12,
+}
+
+public class ThicknessExcludeConverter: IValueConverter
+{
+ public static ThicknessExcludeConverter Left { get; } = new( ThicknessPosition.Left );
+ public static ThicknessExcludeConverter Top { get; } = new( ThicknessPosition.Top );
+ public static ThicknessExcludeConverter Right { get; } = new( ThicknessPosition.Right );
+ public static ThicknessExcludeConverter Bottom { get; } = new( ThicknessPosition.Bottom );
+ public static ThicknessExcludeConverter TopLeft { get; } = new( ThicknessPosition.TopLeft );
+ public static ThicknessExcludeConverter TopRight { get; } = new( ThicknessPosition.TopRight );
+ public static ThicknessExcludeConverter BottomLeft { get; } = new( ThicknessPosition.BottomLeft );
+ public static ThicknessExcludeConverter BottomRight { get; } = new( ThicknessPosition.BottomRight );
+
+ private readonly ThicknessPosition _position;
+ public ThicknessExcludeConverter(ThicknessPosition position)
+ {
+ _position = position;
+ }
+
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (value is Thickness t)
+ {
+ double left = _position.HasFlag(ThicknessPosition.Left) ? 0d: t.Left;
+ double top = _position.HasFlag(ThicknessPosition.Top) ? 0d : t.Top;
+ double right = _position.HasFlag(ThicknessPosition.Right) ? 0d : t.Right;
+ double bottom = _position.HasFlag(ThicknessPosition.Bottom) ? 0d : t.Bottom;
+
+ return new Thickness(left, top, right, bottom);
+ }
+ return AvaloniaProperty.UnsetValue;
+ }
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+}
+
+public class ThicknessIncludeConverter: IValueConverter
+{
+ public static ThicknessIncludeConverter Left { get; } = new( ThicknessPosition.Left );
+ public static ThicknessIncludeConverter Top { get; } = new( ThicknessPosition.Top );
+ public static ThicknessIncludeConverter Right { get; } = new( ThicknessPosition.Right );
+ public static ThicknessIncludeConverter Bottom { get; } = new( ThicknessPosition.Bottom );
+ public static ThicknessIncludeConverter TopLeft { get; } = new( ThicknessPosition.TopLeft );
+ public static ThicknessIncludeConverter TopRight { get; } = new( ThicknessPosition.TopRight );
+ public static ThicknessIncludeConverter BottomLeft { get; } = new( ThicknessPosition.BottomLeft );
+ public static ThicknessIncludeConverter BottomRight { get; } = new( ThicknessPosition.BottomRight );
+
+ private readonly ThicknessPosition _position;
+ public ThicknessIncludeConverter(ThicknessPosition position)
+ {
+ _position = position;
+ }
+
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (value is Thickness t)
+ {
+ var left = _position.HasFlag(ThicknessPosition.Left) ? t.Left : 0d;
+ var top = _position.HasFlag(ThicknessPosition.Top) ? t.Top : 0d;
+ var right = _position.HasFlag(ThicknessPosition.Right) ? t.Right : 0d;
+ var bottom = _position.HasFlag(ThicknessPosition.Bottom) ? t.Bottom : 0d;
+ return new Thickness(left, top, right, bottom);
+ }
+ return AvaloniaProperty.UnsetValue;
+ }
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/src/Ursa/Ursa.csproj b/src/Ursa/Ursa.csproj
index 01a32db..a6c5201 100644
--- a/src/Ursa/Ursa.csproj
+++ b/src/Ursa/Ursa.csproj
@@ -1,6 +1,6 @@
-
+
netstandard2.0
@@ -13,7 +13,7 @@
-
+