[New Control] Descriptions (#791)
* feat: add ColumnWrapPanel. * feat: add Descriptions and DescriptionsItem controls * WIP: extract a LabeledContentControl for this particular need. * wip. * feat: setup demo. fix various initial status issue. * fix: fix a layout issue. * feat: improve demo. * feat: update demo. * fix: remove a redundant calculation. * feat: update per copilot feedback. * feat: add tests, fix a calculation issue. * feat: refactor to change the default label and value binding assignment logic. * feat: introduce orientation. * misc: format codes. * feat: clarify LabelPosition property. * feat: extract Font resources. * revert AvatarDemo. * feat: assign specific value to Font resources for testing. * misc: resolve copilot comment. --------- Co-authored-by: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
This commit is contained in:
38
demo/Ursa.Demo/ViewModels/DescriptionsDemoViewModel.cs
Normal file
38
demo/Ursa.Demo/ViewModels/DescriptionsDemoViewModel.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using System.Collections.ObjectModel;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace Ursa.Demo.ViewModels;
|
||||
|
||||
public partial class DescriptionsDemoViewModel : ObservableObject
|
||||
{
|
||||
public ObservableCollection<DescriptionItemViewModel> Items { get; set; }
|
||||
public ObservableCollection<DescriptionItemViewModel> Items2 { get; set; }
|
||||
|
||||
public DescriptionsDemoViewModel()
|
||||
{
|
||||
Items = new ObservableCollection<DescriptionItemViewModel>()
|
||||
{
|
||||
new() { Label = "Actual Users", Description = "1,480,000" },
|
||||
new() { Label = "7-day Retention", Description = "98%" },
|
||||
new() { Label = "Security Level", Description = "III" },
|
||||
new() { Label = "Category Tag", Description = "E-commerce" },
|
||||
new() { Label = "Authorized State", Description = "Unauthorized" },
|
||||
};
|
||||
Items2 = new ObservableCollection<DescriptionItemViewModel>()
|
||||
{
|
||||
new() { Label = "抖音号", Description = "SemiDesign" },
|
||||
new() { Label = "主播类型", Description = "自由主播" },
|
||||
new() { Label = "安全等级", Description = "3级" },
|
||||
new() { Label = "垂类标签", Description = "编程" },
|
||||
new() { Label = "作品数量", Description = "88888888" },
|
||||
new() { Label = "认证状态", Description = "这是一个很长很长很长很长很长很长很长很长很长的值" },
|
||||
new() { Label = "上次直播时间", Description = "2024-05-01 12:00:00" }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public partial class DescriptionItemViewModel : ObservableObject
|
||||
{
|
||||
[ObservableProperty] private string? _label;
|
||||
[ObservableProperty] private object? _description;
|
||||
}
|
||||
@@ -47,6 +47,7 @@ public partial class MainViewViewModel : ViewModelBase
|
||||
MenuKeys.MenuKeyDatePicker => new DatePickerDemoViewModel(),
|
||||
MenuKeys.MenuKeyDateRangePicker => new DateRangePickerDemoViewModel(),
|
||||
MenuKeys.MenuKeyDateTimePicker => new DateTimePickerDemoViewModel(),
|
||||
MenuKeys.MenuKeyDescriptions => new DescriptionsDemoViewModel(),
|
||||
MenuKeys.MenuKeyDialog => new DialogDemoViewModel(),
|
||||
MenuKeys.MenuKeyDisableContainer => new DisableContainerDemoViewModel(),
|
||||
MenuKeys.MenuKeyDivider => new DividerDemoViewModel(),
|
||||
|
||||
@@ -24,7 +24,10 @@ public class MenuViewModel : ViewModelBase
|
||||
new() { MenuHeader = "KeyGestureInput", Key = MenuKeys.MenuKeyKeyGestureInput },
|
||||
new() { MenuHeader = "IPv4Box", Key = MenuKeys.MenuKeyIpBox },
|
||||
new() { MenuHeader = "MultiComboBox", Key = MenuKeys.MenuKeyMultiComboBox },
|
||||
new() { MenuHeader = "Multi AutoCompleteBox", Key = MenuKeys.MenuKeyMultiAutoCompleteBox, Status = "New" },
|
||||
new()
|
||||
{
|
||||
MenuHeader = "Multi AutoCompleteBox", Key = MenuKeys.MenuKeyMultiAutoCompleteBox, Status = "New"
|
||||
},
|
||||
new() { MenuHeader = "Numeric UpDown", Key = MenuKeys.MenuKeyNumericUpDown },
|
||||
new() { MenuHeader = "NumPad", Key = MenuKeys.MenuKeyNumPad },
|
||||
new() { MenuHeader = "PathPicker", Key = MenuKeys.MenuKeyPathPicker, Status = "New" },
|
||||
@@ -56,11 +59,17 @@ public class MenuViewModel : ViewModelBase
|
||||
MenuHeader = "Date & Time", Children = new ObservableCollection<MenuItemViewModel>
|
||||
{
|
||||
new() { MenuHeader = "Date Picker", Key = MenuKeys.MenuKeyDatePicker, Status = "Updated" },
|
||||
new() { MenuHeader = "Date Range Picker", Key = MenuKeys.MenuKeyDateRangePicker, Status = "Updated" },
|
||||
new()
|
||||
{
|
||||
MenuHeader = "Date Range Picker", Key = MenuKeys.MenuKeyDateRangePicker, Status = "Updated"
|
||||
},
|
||||
new() { MenuHeader = "Date Time Picker", Key = MenuKeys.MenuKeyDateTimePicker, Status = "Updated" },
|
||||
new() { MenuHeader = "Time Box", Key = MenuKeys.MenuKeyTimeBox },
|
||||
new() { MenuHeader = "Time Picker", Key = MenuKeys.MenuKeyTimePicker, Status = "Updated" },
|
||||
new() { MenuHeader = "Time Range Picker", Key = MenuKeys.MenuKeyTimeRangePicker, Status = "Updated" },
|
||||
new()
|
||||
{
|
||||
MenuHeader = "Time Range Picker", Key = MenuKeys.MenuKeyTimeRangePicker, Status = "Updated"
|
||||
},
|
||||
new() { MenuHeader = "Clock", Key = MenuKeys.MenuKeyClock }
|
||||
}
|
||||
},
|
||||
@@ -83,13 +92,14 @@ public class MenuViewModel : ViewModelBase
|
||||
new() { MenuHeader = "AspectRatioLayout", Key = MenuKeys.MenuKeyAspectRatioLayout },
|
||||
new() { MenuHeader = "Avatar", Key = MenuKeys.MenuKeyAvatar, Status = "WIP" },
|
||||
new() { MenuHeader = "Badge", Key = MenuKeys.MenuKeyBadge },
|
||||
new() { MenuHeader = "Banner", Key = MenuKeys.MenuKeyBanner, Status = "Updated" },
|
||||
new() { MenuHeader = "Banner", Key = MenuKeys.MenuKeyBanner },
|
||||
new() { MenuHeader = "Descriptions", Key = MenuKeys.MenuKeyDescriptions, Status = "New" },
|
||||
new() { MenuHeader = "Disable Container", Key = MenuKeys.MenuKeyDisableContainer },
|
||||
new() { MenuHeader = "Divider", Key = MenuKeys.MenuKeyDivider },
|
||||
new() { MenuHeader = "DualBadge", Key = MenuKeys.MenuKeyDualBadge },
|
||||
new() { MenuHeader = "ImageViewer", Key = MenuKeys.MenuKeyImageViewer },
|
||||
new() { MenuHeader = "ElasticWrapPanel", Key = MenuKeys.MenuKeyElasticWrapPanel },
|
||||
new() { MenuHeader = "Marquee", Key = MenuKeys.MenuKeyMarquee, Status = "New" },
|
||||
new() { MenuHeader = "Marquee", Key = MenuKeys.MenuKeyMarquee },
|
||||
new() { MenuHeader = "Number Displayer", Key = MenuKeys.MenuKeyNumberDisplayer },
|
||||
new() { MenuHeader = "Scroll To", Key = MenuKeys.MenuKeyScrollToButton },
|
||||
new() { MenuHeader = "Timeline", Key = MenuKeys.MenuKeyTimeline },
|
||||
@@ -117,6 +127,7 @@ public static class MenuKeys
|
||||
public const string MenuKeyDatePicker = "DatePicker";
|
||||
public const string MenuKeyDateRangePicker = "DateRangePicker";
|
||||
public const string MenuKeyDateTimePicker = "DateTimePicker";
|
||||
public const string MenuKeyDescriptions = "Descriptions";
|
||||
public const string MenuKeyDialog = "Dialog";
|
||||
public const string MenuKeyDisableContainer = "DisableContainer";
|
||||
public const string MenuKeyDivider = "Divider";
|
||||
|
||||
Reference in New Issue
Block a user