#147 – Use SetCurrentValue When You Want to Set A Dependency Property Value from Within a Control

使用SetCurrentValue 方法在控件内部设置依赖属性的值

原文地址:https://wpf.2000things.com/2010/12/06/147-use-setcurrentvalue-when-you-want-to-set-a-dependency-property-value-from-within-a-control/

当你写一个控件的时候,你可能会想设置控件自己拥有的依赖属性的值。举个例子,一个数字递增递减的控件通过点击箭头按钮改变数字的值。

但是问题是直接设置本地属性值,会覆盖其他来源对属性值的改变,比如绑定。如果直接设置本地属性,该属性上所有的绑定都会失效。

这种情况需要使用DependencyObject.SetCurrentValue 方法在控件内部来设置当前属性值。这可能和强制返回有点类似,属性的有效值会被改变,但是不会影响属性来源。

控件应该使用SetCurrentValue 设置自己定义的依赖属性值,CLR属性使用SetValue方法。


**************************

个人总结了下,其实就是使用SetValue方法会覆盖所有依赖属性上的其它操作,例如触发器、数据绑定等。要消除这个影响,保留触发器、数据绑定等就使用SetCurrentValue。


确实,`CharacterSpacing` 属性不是 `TextBlock` 类的依赖属性,所以在 `Setter` 不能直接使用 `CharacterSpacing`。但是,我们可以使用 `Typography` 类的 `CharacterSpacing` 属性来实现相同的效果。具体步骤如下: 1. 在 XAML ,定义一个 ItemsControl 控件,其的 ItemTemplate 属性可以设置 TextBlock 的样式。 2. 在 TextBlock 的样式,通过设置 Typography.CharacterSpacing 属性来控制文字之间的间距。 示例代码如下: ```xml <ItemsControl> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" Style="{StaticResource TextBlockStyle}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> <!-- 定义 TextBlock 的样式 --> <Style x:Key="TextBlockStyle" TargetType="TextBlock"> <Setter Property="Typography.CharacterSpacing" Value="3" /> </Style> ``` 在上面的代码,我们在 TextBlock 的样式设置了 `Typography.CharacterSpacing` 属性的值为 3,表示文字之间的间距为 3 个字符宽度。你可以根据需求来调整 `Typography.CharacterSpacing` 的值。 如果你需要在后台代码动态设置 `Typography.CharacterSpacing` 属性,可以通过 TextBlock 的 SetCurrentValue 方法来实现。示例代码如下: ```csharp // 获取 TextBlock 控件 TextBlock tb = new TextBlock(); // 设置 Typography.CharacterSpacing 属性 tb.SetCurrentValue(Typography.CharacterSpacingProperty, 3.0); ``` 在上面的代码,我们通过 TextBlock 的 SetCurrentValue 方法来设置 `Typography.CharacterSpacing` 属性的值为 3,这样就可以动态地控制文字之间的间距了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值