WinUI中如何基于内置NumberBox为自定义DecimalBox设置样式?
解决WinUI中DecimalBox继承NumberBox默认样式的问题
1. 正确的样式继承写法
WinUI中,让自定义DecimalBox继承NumberBox默认样式,无需知晓具体资源名称,直接用{x:Type}标记扩展引用即可,写法逻辑和WPF一致:
<!-- 先确保已引用自定义控件的命名空间 --> xmlns:controls="using:你的自定义控件命名空间" <Style TargetType="controls:DecimalBox" BasedOn="{StaticResource {x:Type NumberBox}}"/>
{x:Type NumberBox}会自动匹配NumberBox控件的默认样式资源,实现样式继承。
2. 优化后台代码的绑定风险
你当前用new关键字覆盖Value属性的写法存在数据绑定隐患——原生base.Value是依赖属性,但自定义的new Value是普通CLR属性,无法参与WinUI的依赖属性绑定系统。建议改为注册新的依赖属性来处理decimal类型值,示例代码如下:
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; namespace 你的自定义控件命名空间 { public class DecimalBox : NumberBox { public DecimalBox() { DefaultStyleKey = typeof(DecimalBox); // 同步原生Value和自定义DecimalValue的变化 RegisterPropertyChangedCallback(NumberBox.ValueProperty, OnNativeValueChanged); } // 定义decimal类型的依赖属性 public static readonly DependencyProperty DecimalValueProperty = DependencyProperty.Register( nameof(DecimalValue), typeof(decimal), typeof(DecimalBox), new PropertyMetadata(0m, OnDecimalValueChanged)); public decimal DecimalValue { get => (decimal)GetValue(DecimalValueProperty); set => SetValue(DecimalValueProperty, value); } private static void OnNativeValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var box = (DecimalBox)d; box.SetValue(DecimalValueProperty, Convert.ToDecimal(e.NewValue)); } private static void OnDecimalValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var box = (DecimalBox)d; box.Value = Convert.ToDouble((decimal)e.NewValue); } } }
修改后DecimalValue作为依赖属性,支持双向绑定、样式触发器等WinUI原生特性,比new覆盖属性的方式更可靠。
内容的提问来源于stack exchange,提问作者user365462
相关产品推荐
相关产品推荐

