using System.Collections.Specialized; namespace NeumUI.Controls; /// /// 面包屑 /// [StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(BreadcrumbItem))] public class Breadcrumb : ItemsControl { #region 事件 /// /// 导航 /// public static readonly RoutedEvent NavigateEvent = EventManager.RegisterRoutedEvent( "Navigate", RoutingStrategy.Direct, typeof(RoutedPropertyChangedEventHandler), typeof(Breadcrumb)); /// /// 导航 /// public event RoutedPropertyChangedEventHandler Navigate { add => AddHandler(NavigateEvent, value); remove => RemoveHandler(NavigateEvent, value); } #endregion #region 属性 /// /// 链接 /// public static readonly DependencyProperty HrefProperty = DependencyProperty.Register( nameof(Href), typeof(string), typeof(Breadcrumb), new FrameworkPropertyMetadata(string.Empty)); /// /// 链接 /// public string Href { get => (string)GetValue(HrefProperty); set => SetValue(HrefProperty, value); } /// /// 分隔符 /// public static readonly DependencyProperty SeparatorProperty = DependencyProperty.Register(nameof(Separator), typeof(string), typeof(Breadcrumb), new FrameworkPropertyMetadata("/")); /// /// 分隔符 /// public string Separator { get => (string)GetValue(SeparatorProperty); set => SetValue(SeparatorProperty, value); } /// /// 分隔符颜色 /// public static readonly DependencyProperty SeparatorBrushProperty = DependencyProperty.Register( nameof(SeparatorBrush), typeof(Brush), typeof(Breadcrumb), new FrameworkPropertyMetadata(null)); /// /// 分隔符颜色 /// public Brush SeparatorBrush { get => (Brush)GetValue(SeparatorBrushProperty); set => SetValue(SeparatorBrushProperty, value); } #endregion static Breadcrumb() { DefaultStyleKeyProperty.OverrideMetadata(typeof(Breadcrumb), new FrameworkPropertyMetadata(typeof(Breadcrumb))); } /// protected override bool IsItemItsOwnContainerOverride(object item) { return item is BreadcrumbItem; } /// protected override DependencyObject GetContainerForItemOverride() { return new BreadcrumbItem(); } /// public override void OnApplyTemplate() { base.OnApplyTemplate(); Loaded += Breadcrumb_Loaded; } private void Breadcrumb_Loaded(object sender, RoutedEventArgs e) { Loaded -= Breadcrumb_Loaded; for(var i = 0; i < Items.Count; i++) { if(ItemContainerGenerator.ContainerFromIndex(i) is BreadcrumbItem breadcrumbItem) { breadcrumbItem.Navigate += BreadcrumbItem_Navigate; } } } /// protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) { base.OnItemsChanged(e); if(e.OldItems is { }) { foreach(var item in e.NewItems.OfType()) { item.Navigate += BreadcrumbItem_Navigate; } foreach(var item in e.OldItems.OfType()) { item.Navigate -= BreadcrumbItem_Navigate; } } } private void BreadcrumbItem_Navigate(object sender, RoutedPropertyChangedEventArgs e) { RaiseEvent(new RoutedPropertyChangedEventArgs(Href, e.NewValue) { RoutedEvent = NavigateEvent }); Href = e.NewValue; } } /// /// 面包屑子项 /// public class BreadcrumbItem : Button { static BreadcrumbItem() { DefaultStyleKeyProperty.OverrideMetadata( typeof(BreadcrumbItem), new FrameworkPropertyMetadata(typeof(BreadcrumbItem))); } #region 事件 /// /// 导航 /// public static readonly RoutedEvent NavigateEvent = EventManager.RegisterRoutedEvent( "Navigate", RoutingStrategy.Direct, typeof(RoutedPropertyChangedEventHandler), typeof(BreadcrumbItem)); /// /// 导航 /// public event RoutedPropertyChangedEventHandler Navigate { add => AddHandler(NavigateEvent, value); remove => RemoveHandler(NavigateEvent, value); } #endregion #region 属性 /// /// 链接 /// public static readonly DependencyProperty HrefProperty = DependencyProperty.Register( nameof(Href), typeof(string), typeof(BreadcrumbItem), new FrameworkPropertyMetadata(string.Empty)); /// /// 链接 /// public string Href { get => (string)GetValue(HrefProperty); set => SetValue(HrefProperty, value); } /// /// 分隔符 /// public static readonly DependencyProperty SeparatorProperty = DependencyProperty.Register( nameof(Separator), typeof(string), typeof(BreadcrumbItem), new FrameworkPropertyMetadata("/")); /// /// 分隔符 /// public string Separator { get => (string)GetValue(SeparatorProperty); set => SetValue(SeparatorProperty, value); } /// /// 分隔符颜色 /// public static readonly DependencyProperty SeparatorBrushProperty = DependencyProperty.Register( nameof(SeparatorBrush), typeof(Brush), typeof(BreadcrumbItem), new FrameworkPropertyMetadata(null)); /// /// 分隔符颜色 /// public Brush SeparatorBrush { get => (Brush)GetValue(SeparatorBrushProperty); set => SetValue(SeparatorBrushProperty, value); } #endregion /// protected override void OnClick() { base.OnClick(); RaiseEvent(new RoutedPropertyChangedEventArgs(null, Href) { RoutedEvent = NavigateEvent }); } }