2013-06-07 14 views
5

Ho bisogno di impostare il colore del testo quando il testo cambia all'interno della casella di testo e soddisfa determinati criteri. Posso implementarlo dal codice sottostante con evento textbox_textchanged e set brushes.color nel colore desiderato.Cambia il colore di primo piano della casella di testo quando il testo cambia e soddisfa determinati criteri

Ma non riesco a implementarlo con l'approccio xaml wpf. Sono nuovo di wpf, non sono sicuro di come posso impostare il colore del testo in base a determinati criteri quando il testo cambia nella casella di testo.

Ad esempio: per una determinata casella di testo, quando il testo cambia, è necessario determinare se il testo di input è un numero, quindi cambiare il colore di primo piano in verde in rosso.

In attesa dell'aiuto. Grazie in anticipo.

risposta

2

Non sono sicuro se un convertitore di binding è consentito nella vostra situazione. Ma ecco una soluzione che ha bisogno solo di un convertitore di binding nel tuo codice.

Ecco il codice in XAML

<Grid.Resources> 
     <local:ValueConverter x:Key="ValueConverter"></local:ValueConverter> 
    </Grid.Resources> 
    <TextBox Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}"> 
     <TextBox.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=Text,Converter={StaticResource ValueConverter}}" Value="True"> 
         <Setter Property="TextBox.Foreground" Value="Red"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBox.Style> 
    </TextBox> 

Ecco il modello di vista e il convertitore di valori

public class ViewModel : INotifyPropertyChanged 
{ 
    private string _text; 

    public string Text 
    { 
     get 
     { 
      return this._text; 
     } 
     set 
     { 
      this._text = value; 
      if (null != PropertyChanged) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs("Text")); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class ValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (null != value) 
     { 
      if (value.ToString() == "1") 
       return true; 
     } 
     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

Quindi la soluzione utilizza il grilletto di dati al raggiungimento dell'obiettivo. L'unica ragione per utilizzare il convertitore di binding qui è che è necessario un punto per determinare quale tipo di valore dovrebbe modificare il foreground del TextBox. Qui il primo piano di TextBox sarà rosso quando il valore del TextBox è "1".

+0

L'ho implementato e funziona perfettamente. Grazie mille per l'aiuto :) –

+0

@AarohiS È un piacere. Potresti contrassegnare il mio post come la risposta alla tua domanda? Grazie mille. :) – Colin

1

Dovresti essere in grado di collegare l'evento TextChanged in wpf e associare un metodo a questo evento in XAML. Quindi è possibile verificare se i nuovi valori soddisfano i criteri e modificare di conseguenza il colore.

Non sono davvero sicuro di cosa intendi per "approccio XAML" ma in questo caso quando vuoi semplicemente attribuire un comportamento a un evento che viene generato su uno dei tuoi controlli, non penso che sia sbagliato farlo è il modo in cui hai già provato a utilizzare TextChanged. Ecco perché gli eventi sono visibili in XAML in primo luogo.

+0

Grazie.Ho questo campo testo: e ho codificato come: vuoto TextBox_TextChanged (object sender, TextChangedEventArgs e) {privato se (txt_Test.Text == IsANumber) txt_Test.Foreground = Brushes.Red; altro txt_Test.Foreground = Brushes.Green; } Ma, ho bisogno di un approccio diverso utilizzando trigger/datatrigger da xaml o in qualsiasi altro modo possibile. –

+0

Sono confuso sul motivo per cui "hai bisogno" di un approccio diverso qui? Non vedo nulla di sbagliato nel modo in cui stai facendo le cose in questo momento. È un requisito del tuo datore di lavoro o qualcosa del genere? –

+0

Sì, è necessario utilizzare l'approccio xaml piuttosto che il codice appraoch. –

0

Controllare la lunghezza della stringa nella casella di testo che viene scritta su ogni input. Se è> 10 o quello che vuoi che sia, cambia colore. Si potrebbe anche attivare quel pulsante che era disattivato.

Esempio:

MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 

return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height); 
0

Pure XAML? , potresti voler vedere l'interattività, l'interazione, i trigger?

Using EventTrigger in XAML for MVVM – No Code Behind

IMMO penso che sia meglio da collegare a codice proprietà/convertitori/estensioni, ecc ... per una migliore riutilizzo del codice, ma ovviamente soggettivo alle opinioni ... e alla fine è sempre a te.

Problemi correlati