时间:2020年04月16日 | 作者 : aaronyang | 分类 : WPF | 浏览: 1512次 | 评论 0 人
迁移完成了
DEMO1 附加属性的额外设计
由于wpf自带的控件很多依赖属性没有,为了不继承控件
可以采用附加属性。
比如ListBoxItem,TreeViewItem都有选中并且激活状态,设置背景色,字体色,禁用时候颜色,这就3个属性了。
/// <summary> /// Gets or sets the background brush which will be used for the active selected item (if the keyboard focus is within). /// </summary> public static readonly DependencyProperty ActiveSelectionBackgroundBrushProperty = DependencyProperty.RegisterAttached("ActiveSelectionBackgroundBrush", typeof(Brush), typeof(ItemHelper), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.Inherits)); /// <summary> /// Gets the brush the background brush which will be used for the active selected item (if the keyboard focus is within). /// </summary> [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(ListBoxItem))] [AttachedPropertyBrowsableForType(typeof(TreeViewItem))] public static Brush GetActiveSelectionBackgroundBrush(UIElement element) { return (Brush)element.GetValue(ActiveSelectionBackgroundBrushProperty); } /// <summary> /// Sets the brush the background brush which will be used for the active selected item (if the keyboard focus is within). /// </summary> [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(ListBoxItem))] [AttachedPropertyBrowsableForType(typeof(TreeViewItem))] public static void SetActiveSelectionBackgroundBrush(UIElement element, Brush value) { element.SetValue(ActiveSelectionBackgroundBrushProperty, value); }
这里有个知识点
[AttachedPropertyBrowsableForType(typeof(TreeViewItem))]
可以让vs的属性设计器,那里列出来,感觉对xaml更友好
同样知识点2
new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.Inherits));
这里的Options设置
当然还有
new UIPropertyMetadata(Brushes.White));
当然你还可以附加 Style类型的属性,这样可以暴露 接口给使用者
new FrameworkPropertyMetadata(
new CornerRadius(),
FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender));
还有
new FrameworkPropertyMetadata(CharacterCasing.Normal, FrameworkPropertyMetadataOptions.AffectsMeasure),
new ValidateValueCallback(value => CharacterCasing.Normal <= (CharacterCasing)value && (CharacterCasing)value <= CharacterCasing.Upper));
public static readonly DependencyProperty IsHiddenProperty = DependencyProperty.RegisterAttached( "IsHidden", typeof(bool?), typeof(VisibilityHelper), new FrameworkPropertyMetadata(default(bool?), FrameworkPropertyMetadataOptions.AffectsArrange | FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender, IsHiddenChangedCallback)); private static void IsHiddenChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var fe = d as FrameworkElement; if (fe == null) return; fe.Visibility = ((bool?)e.NewValue) == true ? Visibility.Hidden : Visibility.Visible; }
发现个invoke封装的代码
using System; using System.Windows; using System.Windows.Threading; using JetBrains.Annotations; namespace MahApps.Metro.Controls { public static class Extensions { public static T Invoke<T>([NotNull] this DispatcherObject dispatcherObject, [NotNull] Func<T> func) { if (dispatcherObject == null) { throw new ArgumentNullException(nameof(dispatcherObject)); } if (func == null) { throw new ArgumentNullException(nameof(func)); } if (dispatcherObject.Dispatcher.CheckAccess()) { return func(); } else { return (T)dispatcherObject.Dispatcher.Invoke(new Func<T>(func)); } } public static void Invoke([NotNull] this DispatcherObject dispatcherObject, [NotNull] Action invokeAction) { if (dispatcherObject == null) { throw new ArgumentNullException(nameof(dispatcherObject)); } if (invokeAction == null) { throw new ArgumentNullException(nameof(invokeAction)); } if (dispatcherObject.Dispatcher.CheckAccess()) { invokeAction(); } else { dispatcherObject.Dispatcher.Invoke(invokeAction); } } /// <summary> /// Executes the specified action asynchronously with the DispatcherPriority.Background on the thread that the Dispatcher was created on. /// </summary> /// <param name="dispatcherObject">The dispatcher object where the action runs.</param> /// <param name="invokeAction">An action that takes no parameters.</param> /// <param name="priority">The dispatcher priority.</param> public static void BeginInvoke([NotNull] this DispatcherObject dispatcherObject, [NotNull] Action invokeAction, DispatcherPriority priority = DispatcherPriority.Background) { if (dispatcherObject == null) { throw new ArgumentNullException(nameof(dispatcherObject)); } if (invokeAction == null) { throw new ArgumentNullException(nameof(invokeAction)); } dispatcherObject.Dispatcher.BeginInvoke(priority, invokeAction); } public static void BeginInvoke<T>([NotNull] this T dispatcherObject, [NotNull] Action<T> invokeAction, DispatcherPriority priority = DispatcherPriority.Background) where T: DispatcherObject { if (dispatcherObject == null) { throw new ArgumentNullException(nameof(dispatcherObject)); } if (invokeAction == null) { throw new ArgumentNullException(nameof(invokeAction)); } dispatcherObject.Dispatcher?.BeginInvoke(priority, new Action(() => invokeAction(dispatcherObject))); } /// <summary> /// Executes the specified action if the element is loaded or at the loaded event if it's not loaded. /// </summary> /// <param name="element">The element where the action should be run.</param> /// <param name="invokeAction">An action that takes no parameters.</param> public static void ExecuteWhenLoaded([NotNull] this FrameworkElement element, [NotNull] Action invokeAction) { if (element.IsLoaded) { element.Invoke(invokeAction); } else { RoutedEventHandler handler = null; handler = (o, a) => { element.Loaded -= handler; element.Invoke(invokeAction); }; element.Loaded += handler; } } } }
自己把NotNull删掉
测试一个集合ReadOnlyObservableCollection
static MainWindow() { baseColorsInternal = new ObservableCollection<string>() { "123", "456" }; baseColors = new ReadOnlyObservableCollection<string>(baseColorsInternal); } private static readonly ObservableCollection<string> baseColorsInternal; private static readonly ReadOnlyObservableCollection<string> baseColors; private void MainWindow_Loaded(object sender, RoutedEventArgs e) { baseColorsInternal[0] = "789"; MessageBox.Show(baseColors[0]); }
答案是 789
说明是引用类型的
推荐您阅读更多有关于“WPF4.5,”的文章
抖音:wpfui 工作wpf
目前在合肥企迈科技公司上班,加我QQ私聊
2023年11月网站停运,将搬到CSDN上
AYUI8全源码 Github地址:前往获取
杨洋(AaronYang简称AY,安徽六安人)和AY交流
高中学历,2010年开始web开发,2015年1月17日开始学习WPF
声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费
查看捐赠AYUI7.X MVC教程 更新如下:
第一课 第二课 程序加密教程
额 本文暂时没人评论 来添加一个吧
发表评论