如何扩展或覆盖MaterialDesignInXAML的Validation.ErrorTemplate?
解决MaterialDesignInXAML TextBox验证错误信息本地化的方案
方法一:全局替换MaterialDesign的验证错误模板
MaterialDesignInXAML Toolkit的验证错误模板默认通过资源ValidationErrorTemplate定义,我们可以重写该资源,将错误文本绑定替换为WPFSharp.Globalizer的LocalizationBinding,让所有MaterialDesign样式的TextBox自动生效:
<UserControl.Resources> <!-- 确保已引入所需命名空间 --> xmlns:localization="clr-namespace:WPFSharp.Globalizer;assembly=WPFSharp.Globalizer_Net6" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" <!-- 重写全局验证错误模板 --> <ControlTemplate x:Key="ValidationErrorTemplate" TargetType="{x:Type Control}"> <DockPanel> <AdornedElementPlaceholder x:Name="AdornedElementPlaceholder" /> <!-- 保留Popup样式(与你原设置的ValidationAssist.UsePopup="True"匹配) --> <Popup Placement="Bottom" PlacementTarget="{Binding ElementName=AdornedElementPlaceholder}" IsOpen="{Binding (Validation.HasError), ElementName=AdornedElementPlaceholder}"> <Border Background="#FFE57373" Padding="8,4" CornerRadius="4"> <ItemsControl ItemsSource="{Binding (Validation.Errors), ElementName=AdornedElementPlaceholder}"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Foreground="White" Text="{localization:LocalizationBinding ErrorContent, FallbackValue='验证错误未本地化'}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Border> </Popup> </DockPanel> </ControlTemplate> <!-- 让MaterialDesign的TextBox继承并使用新模板 --> <Style TargetType="TextBox" BasedOn="{StaticResource MaterialDesignOutlinedTextBox}"> <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationErrorTemplate}" /> </Style> </UserControl.Resources>
方法二:针对单个TextBox扩展样式
如果只需特定TextBox生效,可以直接继承MaterialDesignOutlinedTextBox样式,单独重写Validation.ErrorTemplate:
<TextBox Width="250" Padding="10" VerticalAlignment="Center" Text="{Binding Value, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" materialDesign:TextFieldAssist.HasClearButton="False"> <TextBox.Style> <Style TargetType="TextBox" BasedOn="{StaticResource MaterialDesignOutlinedTextBox}"> <Setter Property="Validation.ErrorTemplate"> <Setter.Value> <ControlTemplate> <DockPanel> <AdornedElementPlaceholder x:Name="placeholder" /> <!-- 采用你之前习惯的下方显示错误的布局 --> <StackPanel Margin="0,5,0,0"> <ItemsControl ItemsSource="{Binding (Validation.Errors), ElementName=placeholder}"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Foreground="Red" Text="{localization:LocalizationBinding ErrorContent, FallbackValue='验证错误未本地化'}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </StackPanel> </DockPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> </TextBox.Style> </TextBox>
关键注意事项
- 确认
localization命名空间已正确引入到XAML文件的根节点 - 若保留
ValidationAssist.UsePopup="True",需在ErrorTemplate中维持Popup结构;若要改为下方显示,直接替换为StackPanel布局即可 - 验证逻辑返回的
ErrorContent必须是WPFSharp.Globalizer可识别的本地化键值,才能正确加载对应语言的文本
内容的提问来源于stack exchange,提问作者Daimonion
相关产品推荐
相关产品推荐

