WPF如何向Style样式传参实现MaterialDesign提示文本自定义
方案1:借用Tag属性传值(无额外代码,快速实现)
无需编写额外C#代码,直接复用TextBox原生的Tag属性存储自定义提示文本,在Style内部通过相对源绑定取值即可:
<Style TargetType="TextBox" x:Key="TextBoxWithMaterialHintStyle" BasedOn="{StaticResource MaterialTextBox}"> <Setter Property="Foreground" Value="Red" /> <Setter Property="materialDesign:HintAssist.Foreground" Value="Blue" /> <Setter Property="materialDesign:HintAssist.HintOpacity" Value="100" /> <Setter Property="materialDesign:TextFieldAssist.UnderlineBrush" Value="Green" /> <Setter Property="materialDesign:HintAssist.Hint"> <Setter.Value> <TextBlock Foreground="{DynamicResource Lime}" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" /> </Setter.Value> </Setter> </Style>
使用时直接给Tag赋值即可:
<!-- TextBox1 --> <TextBox Style="{StaticResource TextBoxWithMaterialHintStyle}" Tag="SomeHint1"/> <!-- TextBox2 --> <TextBox Style="{StaticResource TextBoxWithMaterialHintStyle}" Tag="SomeHint2"/>
该方案适合快速实现的场景,缺点是会占用Tag属性,若你项目中Tag有其他用途则不适用。
方案2:自定义附加属性(规范做法,无属性冲突)
如果需要更规范的实现,避免属性占用冲突,可以自定义专门的附加属性存储提示文本:
- 首先新建自定义附加属性类:
public static class HintAssistEx { public static readonly DependencyProperty HintTextProperty = DependencyProperty.RegisterAttached( "HintText", typeof(string), typeof(HintAssistEx), new PropertyMetadata(default(string))); public static void SetHintText(DependencyObject element, string value) { element.SetValue(HintTextProperty, value); } public static string GetHintText(DependencyObject element) { return (string)element.GetValue(HintTextProperty); } }
- 修改Style中TextBlock的绑定逻辑:
<TextBlock Foreground="{DynamicResource Lime}" Text="{Binding (local:HintAssistEx.HintText), RelativeSource={RelativeSource AncestorType=TextBox}}" />
- 使用时通过自定义附加属性赋值即可:
<!-- TextBox1 --> <TextBox Style="{StaticResource TextBoxWithMaterialHintStyle}" local:HintAssistEx.HintText="SomeHint1"/> <!-- TextBox2 --> <TextBox Style="{StaticResource TextBoxWithMaterialHintStyle}" local:HintAssistEx.HintText="SomeHint2"/>
该方案适合项目中大量复用的场景,不会和原生属性产生冲突。
内容的提问来源于stack exchange,提问作者Mc_Topaz
相关产品推荐
相关产品推荐

