2016-12-20 3 views
2

J'ai ValidationRule en utilisant System.Windows.Controls et cette règle renvoie un message personnalisé. Mais la taille de la police est trop petite et comment puis-je changer la taille de la police?Comment modifier la taille de la police du résultat de la validation dans WPF C#

capture d'écran ... Textbox content and error content of validation result

Voici un exemple de code de WPF Window App ...

public class NotEmptyValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     if(value != null) 
      return string.IsNullOrWhiteSpace((value ?? "").ToString()) 
       ? new ValidationResult(false, "Field is required") 
       : ValidationResult.ValidResult; 
     return ValidationResult.ValidResult; 
    } 
} 

Voici XAML ... (Remarque: La modification à l'étiquette de Taille de la police TextBox ne fonctionne pas)

<Page... 

<TextBox 
     x:Name="txtName" 
     Grid.Row="1" 
     Grid.Column="1" 
     HorizontalAlignment="Left" 
     VerticalAlignment="Top" 
     Width="210" 
     Margin="5,0,0,0" 
     FontSize="14" 
     Style="{StaticResource MaterialDesignTextBox}"> 
    <TextBox.Text> 
     <Binding Path="RCName" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <local2:NotEmptyValidationRule ValidatesOnTargetUpdated="True"/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

</Page> 
+0

code @Tony_KiloPapaMikeGolf est de WPF et je peux voir le résultat. –

+0

@Tony_KiloPapaMikeGolf est une application WPF, plate-forme Windows. – Valkyrie

+0

Ce n'est pas une question si étrange: ** [Windows Presentation Foundation sur le Web] (https://msdn.microsoft.com/en-us/library/aa480223.aspx) ** –

Répondre

2

pour vos besoins, vous devez modifier le Validation.ErrorTemplate. Puisque vous utilisez MeterialDesign, vous pouvez soit écrire votre style modifié pour TextBox, basé sur le style existant ou seulement écrire ErrorTemplate modifié et l'appliquer directement à TextBox en utilisant la propriété Validation.ErrorTemplate.

<Grid xmlns:controlzEx="clr-namespace:ControlzEx" xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf"> 
    <Grid.Resources> 
     <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
     <!-- New Validation ErrorTemplate --> 
     <ControlTemplate x:Key="ModifiedErrorTemplate"> 
      <ControlTemplate.Resources> 
       <DataTemplate DataType="{x:Type ValidationError}"> 
        <TextBlock MaxWidth="{Binding ElementName=Placeholder, 
                Path=ActualWidth}" 
           Margin="2" 
           HorizontalAlignment="Left" 
           FontSize="12" 
           Foreground="{DynamicResource ValidationErrorBrush}" 
           Text="{Binding ErrorContent}" 
           TextWrapping="Wrap" 
           UseLayoutRounding="false" /> 
       </DataTemplate> 
      </ControlTemplate.Resources> 
      <StackPanel> 
       <AdornedElementPlaceholder Name="Placeholder" /> 
       <Border Name="DefaultErrorViewer" 
         Background="{DynamicResource MaterialDesignPaper}" 
         Visibility="Collapsed"> 
        <TextBlock MaxWidth="{Binding ElementName=Placeholder, 
                Path=ActualWidth}" 
           Margin="0 2" 
           HorizontalAlignment="Left" 
           FontSize="10" 
           Foreground="{DynamicResource ValidationErrorBrush}" 
           Text="{Binding CurrentItem.ErrorContent}" 
           TextWrapping="Wrap" 
           UseLayoutRounding="false" /> 
       </Border> 
       <controlzEx:PopupEx x:Name="ValidationPopup" 
            AllowsTransparency="True" 
            IsOpen="False" 
            Placement="Bottom" 
            PlacementTarget="{Binding ElementName=Placeholder, 
                   Mode=OneWay}"> 
        <Border Background="{DynamicResource MaterialDesignPaper}"> 
         <TextBlock Margin="0 2" 
            HorizontalAlignment="Left" 
            FontSize="10" 
            Foreground="{DynamicResource ValidationErrorBrush}" 
            Text="{Binding CurrentItem.ErrorContent}" 
            TextWrapping="Wrap" 
            UseLayoutRounding="false" /> 
        </Border> 
       </controlzEx:PopupEx> 
      </StackPanel> 
      <ControlTemplate.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.OnlyShowOnFocus)}" Value="False" /> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="True" /> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.Suppress)}" Value="False" /> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.Setters> 
         <Setter TargetName="ValidationPopup" Property="IsOpen" Value="True" /> 
        </MultiDataTrigger.Setters> 
       </MultiDataTrigger> 

       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.OnlyShowOnFocus)}" Value="False" /> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="False" /> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.Suppress)}" Value="False" /> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.Setters> 
         <Setter TargetName="DefaultErrorViewer" Property="Visibility" Value="Visible" /> 
        </MultiDataTrigger.Setters> 
       </MultiDataTrigger> 

       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.OnlyShowOnFocus)}" Value="True" /> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="True" /> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.Setters> 
         <Setter TargetName="ValidationPopup" Property="IsOpen" Value="{Binding ElementName=Placeholder, Path=AdornedElement.IsKeyboardFocusWithin, Mode=OneWay}" /> 
        </MultiDataTrigger.Setters> 
       </MultiDataTrigger> 

       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.OnlyShowOnFocus)}" Value="True" /> 
         <Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="False" /> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.Setters> 
         <Setter TargetName="DefaultErrorViewer" Property="Visibility" Value="{Binding ElementName=Placeholder, Path=AdornedElement.IsKeyboardFocusWithin, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
        </MultiDataTrigger.Setters> 
       </MultiDataTrigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     <!-- Derived TextBox Style --> 
     <Style x:Key="ExtendedMaterialDesignTextBox" 
       BasedOn="{StaticResource MaterialDesignTextBox}" 
       TargetType="TextBox"> 
      <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ModifiedErrorTemplate}" /> 
     </Style> 
    </Grid.Resources> 
    <TextBox x:Name="txtName" 
      Grid.Row="1" 
      Grid.Column="1" 
      Width="210" Style="{StaticResource ExtendedMaterialDesignTextBox}" 
      Margin="5,0,0,0" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      FontSize="14"> 
     <TextBox.Text> 
      <Binding NotifyOnValidationError="True" 
        Path="RCName" 
        UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <local:NotEmptyValidationRule ValidatesOnTargetUpdated="True" /> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
</Grid> 

le style de TextBox ErrorTemplate a été copié à partir here

+0

Pouvez-vous expliquer un peu plus comment est-ce que vous liez 'ControlTemplate' à la zone de texte? Parce que je ne vois pas de lien entre eux, et il se passe beaucoup de choses. Je l'apprécierais vraiment. – FCin

+0

@FCin veuillez voir le style ExtendedMaterialDesignTextBox dans le code affiché. Whee ControlTemplate (ModifiedErrorTemplate) est appliqué à la propriété Validation.ErrorTemplate de TextBox. – WPFUser

+1

@FCin, @WPFUser Je pense que c'est juste un nom de clé sans équivalent pour 'ControlTemplate'. _MaterialDesignValidationErrorTemplate_ pour la déclaration et _ModifiedErrorTemplate_ pour l'utilisation. –