using System; using System.Collections.Concurrent; using System.Windows; using System.Windows.Controls; namespace AIStudio.Wpf.DiagramDesigner { public class DesignerItemsControlItemStyleSelector : StyleSelector { static DesignerItemsControlItemStyleSelector() { Instance = new DesignerItemsControlItemStyleSelector(); } public static DesignerItemsControlItemStyleSelector Instance { get; private set; } private static ConcurrentDictionary _styles = new ConcurrentDictionary(); public void RegisterDesignerItemControlItemStyle(Type type, string resourceName) { if (_styles.ContainsKey(type)) { throw new InvalidOperationException($"{type}-{resourceName} already exists"); } _styles.TryAdd(type, resourceName); } public void RegisterDesignerItemControlItemStyle(Type type, string resourceName, bool isCover) { if (_styles.ContainsKey(type)) { _styles[type] = resourceName; } _styles.TryAdd(type, resourceName); } public override Style SelectStyle(object item, DependencyObject container) { ItemsControl itemsControl = ItemsControl.ItemsControlFromItemContainer(container); if (itemsControl == null) throw new InvalidOperationException("DesignerItemsControlItemStyleSelector : Could not find ItemsControl"); if (!_styles.IsNullOrEmpty()) { var type = item.GetType(); if (_styles.ContainsKey(type)) { return (Style)itemsControl.FindResource(_styles[type]); } foreach (var styleItem in _styles) { if (type.IsSubclassOf(styleItem.Key)) { return (Style)itemsControl.FindResource(styleItem.Value); } if (type.IsAssignableFrom(styleItem.Key)) { return (Style)itemsControl.FindResource(styleItem.Value); } } } if (item is GifImageItemViewModel) { return (Style)itemsControl.FindResource("gifimageItemStyle"); } if (item is LogicalGateItemViewModelBase) { return (Style)itemsControl.FindResource("logicalItemStyle"); } if (item is BlockDesignerItemViewModel) { return (Style)itemsControl.FindResource("blockItemStyle"); } if (item is DesignerItemViewModelBase) { return (Style)itemsControl.FindResource("designerItemStyle"); } if (item is ConnectionViewModel) { return (Style)itemsControl.FindResource("connectorItemStyle"); } return null; } } }