1
votes

Comment créer une zone de texte personnalisée qui ne remplacerait pas le style dans WPF .XAML

J'ai donc créé une zone de texte personnalisée, qui n'autoriserait que les nombres:

base.OnTextChanged(e);

Le problème auquel je suis confronté est que lorsque je le crée de cette façon,

protected override void OnPaint(PaintEventArgs pe)
{
   base.OnPaint(pe);
   // Insert code to do custom painting.
   // If you want to completely change the appearance of your control,
   // do not call base.OnPaint(pe).
}

Ou

<u:IntegerTextBox/>

dans mon .xaml

Il remplace également le style par défaut utilisé par l'environnement dans lequel je travaille à (Milestone Systems). Donc au lieu d'obtenir des TextBoxes grises que je devrais obtenir, j'obtiens la TextBox blanche par défaut de Windows.

Dans la documentation Microsoft, j'ai trouvé un exemple similaire avec l'explication, mais je n'arrive pas vraiment à trouver un moyen pour le faire fonctionner: exemple de remplacement

IntegerTextBox textBox = new IntegerTextBox() {... };

Pour autant que je sache, il est dit: n'appelez pas le

public partial class IntegerTextBox : TextBox
{
    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        base.OnTextChanged(e);

        Text = new String(Text.Where(c => Char.IsDigit(c)).ToArray());
        SelectionStart = Text.Length;
    }
}


1 commentaires

Pouvez-vous s'il vous plaît montrer le constructeur de votre classe. Remplacez-vous le style par défaut ici?


3 Réponses :


0
votes

Le problème se produit probablement parce que la nouvelle classe IntegerTextBox n'utilise pas le style utilisé par la classe TextBox de base. Veuillez vous référer au fil suivant où un problème similaire a déjà été discuté: https://stackoverflow.com/a/6780802/12797700


0 commentaires

0
votes

Si vous ne voulez pas redéfinir le style de la zone de texte, vous n'avez même pas besoin de créer une zone de texte personnalisée, mais tout ce dont vous avez besoin est "Propriété attachée".

Dans votre projet (projet d'interface utilisateur si c'est MVVM) créez une classe comme en utilisant le contenu ci-dessous:

local:TextBoxExtensions.OnlyNumbersAllowed="True"

Vous pouvez maintenant l'utiliser n'importe où (uniquement pour les TextBoxes) dans vos vues, comme ceci:

public class TextBoxExtensions
    {

        public static readonly DependencyProperty OnlyNumbersAllowedProperty =
            DependencyProperty.Register("OnlyNumbersAllowed", typeof(int), typeof(TextBoxExtensions), new PropertyMetadata(false,
                (o, args) =>
                {
                    // Assuring we are dealing with TextBox.
                    if (!(o is TextBox textField))
                        return;

                    // make sure TextBox contains characters.
                    if (textField.Text.Length == 0)
                        return;

                    // if TextBox only contains numbers then we are fine and don't go any further.
                    if (textField.Text.All(char.IsDigit)) return;

                    // A letter has been written in TextBox so that we remove it.
                    var result = textField.Text.Remove(textField.Text.Length - 1, 1);
                    textField.Text = result;


                }));

        public static bool GetOnlyNumberSupported(DependencyObject obj)
        {
            return (bool)obj.GetValue(OnlyNumbersAllowedProperty);
        }

        public static void SetOnlyNumberSupported(DependencyObject obj, bool value)
        {
            obj.SetValue(OnlyNumbersAllowedProperty, value);
        }

    }

Astuce: local est un chemin vers l'emplacement de la classe ci-dessus dans votre projet qui peut être déclaré via "xmlns".


0 commentaires

1
votes

Définissez un Style implicite pour votre IntegerTextBox dans App.xaml:

<Style TargetType="{x:Type local:IntegerTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">

Alors il devrait hérite de tout Style implicite actuellement appliqué aux éléments .


0 commentaires