Wpf zmena farby textBoxov   zodpovězená otázka

C#, WPF

V svojom nižšie uvedenom programe sa po nagenerovaní textBoxov a buttonov po kliknutí na nagenerovaný buton zafarbia textBoxy. Po kliknutí na iný button sa zafarbia ďalšie textBoxy, ale zostanú zafarbené aj tie predošlé u ktorých by farba sa mala zmeniť na pôvodnú. Poradí mi niekto prosím, ako to mám urobiť? Nejako cez foreach, ale neviem ako.

 public partial class MainWindow : Window
    {
      int textBoxCislo =1;    
        public MainWindow()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            GenerateTextBox();
        }
        private void GenerateTextBox()
        {
            var panel = new StackPanel() { Orientation = Orientation.Horizontal };
            var textbox = new TextBox() { Name = "a" + textBoxCislo.ToString(), Text = textBoxCislo.ToString(), Width = 20 };
            panel.Children.Add(textbox);
            textbox = new TextBox() { Name = "b" + textBoxCislo.ToString(), Text = textBoxCislo.ToString(), Width = 20 };
            panel.Children.Add(textbox);
            var btnX = new Button() { Name = "btn" + textBoxCislo.ToString(), Tag= textBoxCislo.ToString() };
        btnX.Click +=btnX_Click;
           panel.Children.Add(btnX);           
            stackPanel1.Children.Add(panel);
            this.textBoxCislo++;
        } 
       private void btnX_Click(object sender, RoutedEventArgs e)
       {         
           var panel = (DependencyObject)VisualTreeHelper.GetParent((DependencyObject)sender);
           TextBox textBoxA = null;
           TextBox textBoxB = null; 
           for (int i = 0; i < VisualTreeHelper.GetChildrenCount(panel); i++)
           {
               var element = (FrameworkElement)VisualTreeHelper.GetChild(panel, i);
               if (element.Name.StartsWith("a"))
               {
                   textBoxA = (TextBox)element;
                   textBoxA.Background = new SolidColorBrush(Colors.Aqua);
               }
              
               if (element.Name.StartsWith("b") && !element.Name.StartsWith("btn"))
               {
                   textBoxB = (TextBox)element;
                   textBoxB.Background = new SolidColorBrush(Colors.Aqua);
               }
           }
           MessageBox.Show(textBoxA.Text + " " + textBoxB.Text);
       }
    }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

A jak jste přišel na to, že by se měla barva původně zbarvených textboxů změnit? Nikde v přiloženém kódu nevidím, že byste někde resetoval nastavení komponent či něco podobného.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak napríklad:


private void btnX_Click(object sender, RoutedEventArgs e)
{var panel = (DependencyObject)VisualTreeHelper.GetParent((DependencyObject)sender); 
          
TextBox textBoxA = null;           
TextBox textBoxB = null;            
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(panel); i++)           
{var element = (FrameworkElement)VisualTreeHelper.GetChild(panel, i);              
if (element.Name.StartsWith("a"))               {                   
textBoxA = (TextBox)element;                   
'''textBoxA.Background = new SolidColorBrush(Colors.Aqua);''');               
}              
} 

A toto Background potrebujem po kliknutí na napríklad Button2 pre všetky textBoxA a textBoxB zmeniť znova na pôvodnú farbu.

Pekný deň prajem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je sice hezké, ale zde děláte pouze přebarvení, nikoliv reset barev na původní hodnotu. Z Vašeho popisu mi není jasné, čeho vlastně chcete docílit. Pokud pouze toho, že při kliknutí na jiný button dojde ke změně barev textboxů, tak vytvořte novou metodu pro Button_Click (popřípadě použijte stávající a jen řešte z kterého prvku požadavek přijde) a tam nastavte požadovanou barvu pozadí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Lenže ja potrebujem zmeniť farbu nie na tom prvku z ktorého prišla požiadavka, ale na ostatných.

Práve tú metódu neviem vytvoriť.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Alebo jednoducho po kliknutí na btnX by sa najprv mala zrezetovať farba všetkých textBoxov.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Potreboval som niečo také. Do kódu si to už viem umiestniť.

       private void button2_Click(object sender, RoutedEventArgs e)
       {
           foreach (TextBox tb in FindVisualChildren<TextBox>(stackPanel1))
{
   
    if(tb.Name.StartsWith("a")||tb.Name.StartsWith("b"))
    {
        tb.Background = new SolidColorBrush(SystemColors.ActiveCaptionTextColor);
    }
}          

       }
       public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
       {
           if (depObj != null)
           {
               for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
               {
                   DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                   if (child != null && child is T)
                   {
                       yield return (T)child;
                   }

                   foreach (T childOfChild in FindVisualChildren<T>(child))
                   {
                       yield return childOfChild;
                   }
               }
           }
       }
nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Takove operace jsou extremne nakladne a v tomto pripade uplne zbytecne. Tento kod je v code-behind takze mas uplne jednoduchy pristup ke vsem tlacitkum a nemusis pouzivat metodu FindVisualChildren.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ďakujem Ti za odpoveď. Som veľmi rád, že som som sa dozvedel, že môj kód je v code-behind a že mám jednoduchý prístup ku všetkým tlačidlam. Akurát, že mám taký pocit, že presne na to som sa pýtal.

Pekný večer prajem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dúfal som, že mi poradíš niečo jednoduchšie. Dosť mi záleží na tom, aby to nebolo nákladné.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback