feat: add temp template.

This commit is contained in:
rabbitism
2024-02-17 21:10:24 +08:00
parent 495b5651a7
commit a574fb76b4
12 changed files with 176 additions and 26 deletions

View File

@@ -0,0 +1,34 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:u="https://irihi.tech/ursa">
<!-- Add Resources Here -->
<ControlTheme x:Key="{x:Type u:Form}" TargetType="u:Form">
<Setter Property="Template">
<ControlTemplate TargetType="u:Form">
<ItemsPresenter ItemsPanel="{TemplateBinding ItemsPanel}"></ItemsPresenter>
</ControlTemplate>
</Setter>
</ControlTheme>
<ControlTheme x:Key="{x:Type u:FormGroup}" TargetType="u:FormGroup">
<Setter Property="Template">
<ControlTemplate TargetType="u:FormGroup">
<StackPanel>
<ContentPresenter Content="{TemplateBinding Header}"/>
<ItemsPresenter ItemsPanel="{TemplateBinding ItemsPanel}"/>
</StackPanel>
</ControlTemplate>
</Setter>
</ControlTheme>
<ControlTheme x:Key="{x:Type u:FormItem}" TargetType="u:FormItem">
<Setter Property="Template">
<ControlTemplate TargetType="u:FormItem">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{TemplateBinding Label}" />
<ContentPresenter Content="{TemplateBinding Content}"/>
</StackPanel>
</ControlTemplate>
</Setter>
</ControlTheme>
</ResourceDictionary>

View File

@@ -11,6 +11,7 @@
<ResourceInclude Source="Drawer.axaml" />
<ResourceInclude Source="DualBadge.axaml" />
<ResourceInclude Source="EnumSelector.axaml" />
<ResourceInclude Source="Form.axaml" />
<ResourceInclude Source="IconButton.axaml" />
<ResourceInclude Source="ImageViewer.axaml" />
<ResourceInclude Source="IPv4Box.axaml" />

View File

@@ -1,25 +1,32 @@
using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Markup.Xaml.Templates;
using Avalonia.Metadata;
namespace Ursa.Controls;
public class Form: ItemsControl
{
public static readonly StyledProperty<AvaloniaList<FormItem>> ItemsProperty = AvaloniaProperty.Register<Form, AvaloniaList<FormItem>>(
"Items");
public static readonly AttachedProperty<string> LabelProperty =
AvaloniaProperty.RegisterAttached<Form, Control, string>("Label");
public static void SetLabel(Control obj, string value) => obj.SetValue(LabelProperty, value);
public static string GetLabel(Control obj) => obj.GetValue(LabelProperty);
public AvaloniaList<FormItem> Items
{
get => GetValue(ItemsProperty);
set => SetValue(ItemsProperty, value);
}
public void AddChild(object child)
public static readonly AttachedProperty<bool> IsRequiredProperty =
AvaloniaProperty.RegisterAttached<Form, Control, bool>("IsRequired");
public static void SetIsRequired(Control obj, bool value) => obj.SetValue(IsRequiredProperty, value);
public static bool GetIsRequired(Control obj) => obj.GetValue(IsRequiredProperty);
protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey)
{
throw new NotImplementedException();
recycleKey = null;
return item is FormItem or FormGroup;
}
protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
{
if (item is not Control control) return new FormItem();
string label = GetLabel(control);
bool isRequired = GetIsRequired(control);
return new FormItem() { Label = label, IsRequired = isRequired, Content = control };
}
}

View File

@@ -3,7 +3,19 @@ using Avalonia.Controls.Primitives;
namespace Ursa.Controls;
public class FormGroup: HeaderedItemsControl, IFormItem
public class FormGroup: HeaderedItemsControl
{
protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey)
{
recycleKey = null;
return item is not FormItem or FormGroup;
}
protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
{
if (item is not Control control) return new FormItem();
var label = Form.GetLabel(control);
var isRequired = Form.GetIsRequired(control);
return new FormItem() { Label = label, IsRequired = isRequired, Content = control };
}
}

View File

@@ -1,8 +1,27 @@
using Avalonia.Controls.Primitives;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
namespace Ursa.Controls;
public class FormItem: TemplatedControl, IFormItem
public class FormItem: ContentControl
{
public static readonly StyledProperty<string> LabelProperty = AvaloniaProperty.Register<FormItem, string>(
nameof(Label));
public string Label
{
get => GetValue(LabelProperty);
set => SetValue(LabelProperty, value);
}
public static readonly StyledProperty<bool> IsRequiredProperty = AvaloniaProperty.Register<FormItem, bool>(
nameof(IsRequired));
public bool IsRequired
{
get => GetValue(IsRequiredProperty);
set => SetValue(IsRequiredProperty, value);
}
}

View File

@@ -1,9 +0,0 @@
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
namespace Ursa.Controls;
public interface IFormItem
{
}