C# 如何为验证规则定制模板';默认的工具提示是什么?

C# 如何为验证规则定制模板';默认的工具提示是什么?,c#,wpf,validation,xaml,controltemplate,C#,Wpf,Validation,Xaml,Controltemplate,使用验证规则时,如何为自动应用于控件的默认工具提示创建自定义模板?还有什么方法可以更改此工具提示的持续时间 我的意思是这个工具提示: XAML: C#: class ValidateTextBox:ValidationRule { Regex Regex=new Regex(@“[\\/:*?”“”); 公共覆盖验证结果验证(对象值,CultureInfo CultureInfo) { 字符串txtNameText=作为字符串的值; if(regex.IsMatch(txtNameTe

使用验证规则时,如何为自动应用于控件的默认工具提示创建自定义模板?还有什么方法可以更改此工具提示的持续时间

我的意思是这个工具提示:

XAML:



C#:

class ValidateTextBox:ValidationRule
{
Regex Regex=new Regex(@“[\\/:*?”“”);
公共覆盖验证结果验证(对象值,CultureInfo CultureInfo)
{
字符串txtNameText=作为字符串的值;
if(regex.IsMatch(txtNameText))
{
返回新的ValidationResult(false,“文件名不能包含以下任何字符:\n\\/:*?\”<>|“);
}
其他的
{
返回新的ValidationResult(true,null);
}
}
}

您必须调整您的
文本框
样式,或者创建一个新的样式,以便将
工具提示设置为当前错误

  • 第一个setter设置您的自定义
    工具提示
    模板
  • 第二个setter使用设置attached属性,该属性确定工具提示应该显示多长时间
  • 使用附加属性
    Validation.HasError
    触发器
    仅在出现错误时应用工具提示。这允许您在其他setter中指定默认工具提示
  • 由于
    工具提示
    与其关联控件不在同一可视树中,因此必须使用绑定到其
    放置目标
    (文本框)
,其中附加了验证错误
从您的
文本框中删除
验证.ErrorTemplate
,因为它已经包含在样式中。

谢谢您的回答,但是现在当我将鼠标悬停在文本框上时,工具提示内容为空,而且当文本框为空且没有任何错误时,它仍然在鼠标上显示工具提示hover@SMH它起作用了对我来说,正如预期的那样。尝试在空解决方案中测试此问题,或者不应用任何其他样式或修改。可能存在导致此问题的其他样式或属性集。是的,它现在工作正常,很抱歉,这是我的错误,我忘记删除添加到文本框本身的工具提示。
<Window.Resources>
   <!--Validation Template-->
   <ControlTemplate x:Key="MyErrorTemplate">
      <Border BorderBrush="#e92539" BorderThickness="2" CornerRadius="10">
         <Grid>
            <AdornedElementPlaceholder/>
         </Grid>
      </Border>
   </ControlTemplate>
</Window.Resources>
<TextBox FontSize="13" Validation.ErrorTemplate="{StaticResource MyErrorTemplate}"
         AcceptsReturn="False" Panel.ZIndex="3" x:Name="txtName"
         Style="{StaticResource MyTextBox}" Grid.Row="2">
   <TextBox.Text>
      <Binding Path="txtName" Mode="TwoWay"
               UpdateSourceTrigger="PropertyChanged"
               ValidatesOnDataErrors="True">
         <Binding.ValidationRules>
            <local:ValidateTextBox/>
         </Binding.ValidationRules>
      </Binding>
   </TextBox.Text>
</TextBox>
class ValidateTextBox : ValidationRule
{
    Regex regex = new Regex(@"[\\/:*?""<>|]");

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string txtNameText = value as string;
        if (regex.IsMatch(txtNameText))
        {
            return new ValidationResult(false, "A file name can't contain any of the following characters:\n \\ / : * ? \" < > |");
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }
}
<Style x:Key="MyTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
   <Setter Property="Validation.ErrorTemplate" Value="{StaticResource MyErrorTemplate}"/>
   <Setter Property="ToolTipService.ShowDuration" Value="5000"/>
   <Style.Triggers>
      <Trigger Property="Validation.HasError" Value="True">
         <Setter Property="ToolTip">
            <Setter.Value>
               <ToolTip Template="{StaticResource ToolTipTemplate}"
                        Content="{Binding PlacementTarget.(Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource Self}}"/>
            </Setter.Value>
         </Setter>
      </Trigger>
   </Style.Triggers>
</Style>
<ControlTemplate x:Key="ToolTipTemplate" TargetType="ToolTip">
   <Grid MaxWidth="400">
      <Border Margin="0,0,35,35"
              Background="#212529"
              BorderBrush="#6C757D"
              BorderThickness="1.7"
              CornerRadius="5">
         <Border.Effect>
            <DropShadowEffect Color="Black"
                              Direction="310"
                              ShadowDepth="14"
                              BlurRadius="34"
                              Opacity="0.3"/>
         </Border.Effect>
         <TextBlock Margin="7"
                    Text="{TemplateBinding Content}"
                    VerticalAlignment="Top"
                    TextWrapping="Wrap"
                    HorizontalAlignment="Left"
                    Foreground="#ADB5BD">
         </TextBlock>
      </Border>
   </Grid>
</ControlTemplate>