Comment pouvez-vous changer la couleur de texte surlignée pour une zone de texte WPF?
-
03-07-2019 - |
Question
La WPF TextBox
utilise nativement la couleur de surbrillance du système pour peindre l'arrière-plan du texte sélectionné. Je voudrais remplacer ceci et le rendre cohérent car il varie selon le thème du système d'exploitation / utilisateur.
Pour les ListBoxItem
, il existe un astuce soignée (voir ci-dessous) où vous pouvez remplacer la clé de ressource pour le HighlightBrushKey
pour personnaliser la couleur de surbrillance du système dans un paramètre défini:
<Style TargetType="ListBoxItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightGreen"/>
</Style.Resources>
</Style>
Malheureusement, la même astuce ne fonctionne pas pour la TextBox
. Quelqu'un a-t-il d'autres idées à part "remplacer le ControlTemplate
"?
Merci pour vos suggestions!
REMARQUE: Cette Ce comportement semble avoir été ajouté à WPF 4.
La solution
Comme l'a mentionné Steve: REMARQUE: ce problème semble avoir été ajouté à WPF 4.
Je suis tombé sur le même problème.
Comme le dit le Dr.WPF
"Il est tout à fait impossible dans le Versions actuelles .NET (3.0 & 3.5 bêta). Le contrôle est codé en dur utilisez les paramètres du système ... ça ne marche pas examinez le modèle de contrôle. "
http: //social.msdn.microsoft.com/Forums/en-US/wpf/thread/bbffa6e3-2745-4e72-80d0-9cdedeb69f7f/
Autres conseils
Depuis .NET 4, < code> TextBoxBase.SelectionBrush
par exemple
<TextBox SelectionBrush="Red" SelectionOpacity="0.5"
Foreground="Blue" CaretBrush="Blue">
Il s'agit d'une solution testée sous Windows 8.1 .Net 4.6.1 pour personnaliser le SelectionBrush
de chaque TextBox
de l'application:
/// Constructor in App.xaml.cs
public App() : base()
{
// Register an additional SelectionChanged handler for appwide each TextBox
EventManager.RegisterClassHandler(typeof(TextBox), TextBox.SelectionChangedEvent, RoutedEventHandler(_textBox_selectionChanged));
}
private void _textBox_selectionChanged(object sender, RoutedEventArgs e)
{
// Customize background color of selected text
(sender as TextBox).SelectionBrush = Brushes.MediumOrchid;
// Customize opacity of background color
(sender as TextBox).SelectionOpacity = 0.5;
}
Si vous souhaitez inclure RichTextBox
, remplacez le nom du type TextBox
4 fois par TextBoxBase
.
Vous pouvez créer un style pour la zone de texte et écrire un sélecteur pour l'arrière-plan. Le style TextBox doit être un style par défaut pour que toute TextBox figurant dans l’arborescence visuelle obtienne la TextBox modifiée
<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
Essayez ceci:
<Trigger Property="IsHighlighted" Value="True">
<Setter TargetName="Border" Property="Background" Value="OrangeRed"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>