You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展或覆盖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:35:18