Solitamente si accede ai controlli utilizzando i loro nomi, ma quando da codice si devono manipolare più controlli dello stesso tipo ciclicamente, il nome può essere d'ostacolo, e un indice è di aiuto.

Se programmate in .NET, sapete che ogni controllo aggiunto nei forms o windows, faranno parte di una matrice che con foreach può essere scansionata, per accedere ai vari controlli.

Se nel nostro form abbiamo un numero elevato di controlli, le istruzioni foreach che dovremo concatenare con i rispettivi if per verificarne il tipo, potrebbero complicare di molto la leggibilità del programma, vanificando di fatto lo scopo di foreach, nato per semplificare la gestione dei controlli.

In tutti i linguaggi è buona norma inserire i controlli all'interno di contenitori, che poi ne semplificheranno la gestione.

Il semplice esempio riportato, non è per imparare su come organizzare i controlli, bensì per vedere in un progetto WPF, come la sintassi C# per raggiungere i controlli, differisca dalla sintassi WinForm.

Aprite un nuovo progetto WPF:

VS2017

Se il template non compare dovrete, tramite l'installer, aggiungerlo.

Nell'esempio, in MainWindow, sono stati aggiunti tramite XAML, 2 contenitori: Canvas1 e Canvas2.

All'interno di Canvas1 ho collocato 6 controlli Rectangle

All'interno di Canvas2 ho collocato 6 controlli TextBox

al di fuori dei Canvas 6 radiobuttons che semplicemente simuleranno la chiamata alla routine AccediAiControlli()

L'ordine in cui appaiono i controlli nell'XAML, ne determina l'indice, in questo caso da 0 a 5

Copia e incolla in "MainWindow.xaml"

<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Canvas x:Name="Canvas1" HorizontalAlignment="Left" Height="206" VerticalAlignment="Top" Width="300" Margin="207,105,0,0"> <Rectangle Fill="#FFF4F4F5" Height="100" Stroke="Black" Width="100"/> <Rectangle Fill="#FFF4F4F5" Height="100" Stroke="Black" Width="100" Canvas.Left="100"/> <Rectangle Fill="#FFF4F4F5" Height="100" Stroke="Black" Width="100" Canvas.Left="200"/> <Rectangle Fill="#FFF4F4F5" Height="100" Stroke="Black" Width="100" Canvas.Top="100"/> <Rectangle Fill="#FFF4F4F5" Height="100" Stroke="Black" Width="100" Canvas.Left="100" Canvas.Top="100"/> <Rectangle Fill="#FFF4F4F5" Height="100" Stroke="Black" Width="100" Canvas.Left="200" Canvas.Top="100"/> </Canvas> <Canvas x:Name="Canvas2" HorizontalAlignment="Left" Height="206" VerticalAlignment="Top" Width="151" Margin="567,105,0,0"> <TextBox Height="23" TextWrapping="Wrap" Text="TextBox" Width="120" Canvas.Top="34"/> <TextBox Height="23" TextWrapping="Wrap" Text="TextBox" Width="120" Canvas.Top="58"/> <TextBox Height="23" TextWrapping="Wrap" Text="TextBox" Width="120" Canvas.Top="82"/> <TextBox Height="23" TextWrapping="Wrap" Text="TextBox" Width="120" Canvas.Top="106"/> <TextBox Height="23" TextWrapping="Wrap" Text="TextBox" Width="120" Canvas.Top="130"/> <TextBox Height="23" TextWrapping="Wrap" Text="TextBox" Width="120" Canvas.Top="154"/> </Canvas> <RadioButton x:Name="_1" Content="RadioButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,144,0,0" Click="_1_Click"/> <RadioButton x:Name="_2" Content="RadioButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,166,0,0" Click="_2_Click"/> <RadioButton x:Name="_3" Content="RadioButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,188,0,0" Click="_3_Click"/> <RadioButton x:Name="_4" Content="RadioButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,210,0,0" Click="_4_Click"/> <RadioButton x:Name="_5" Content="RadioButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,232,0,0" Click="_5_Click"/> <RadioButton x:Name="_6" Content="RadioButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,254,0,0" Click="_6_Click"/> </Grid> </Window>

Il semplice codice C#, serve per mostrare la sintassi di accesso ai controlli WPF in modo selettivo e non. Copia e incolla in MainWindow.xaml.cs:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// Logica di interazione per MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // conterrà una lista di colori indicizzata
        public static List<Brush> Colore = new List<Brush>();
        public MainWindow()
        {
            InitializeComponent();

            // 6 colori a caso in una lista di colori
            Colore.Add(Brushes.Honeydew);
            Colore.Add(Brushes.Aqua);
            Colore.Add(Brushes.Maroon);
            Colore.Add(Brushes.Yellow);
            Colore.Add(Brushes.Red);
            Colore.Add(Brushes.Green);
        }

        private void _1_Click(object sender, RoutedEventArgs e)
        {
            AccediAlControllo(1);
        }

        private void _2_Click(object sender, RoutedEventArgs e)
        {
            AccediAlControllo(2);
        }

        private void _3_Click(object sender, RoutedEventArgs e)
        {
            AccediAlControllo(3);
        }

        private void _4_Click(object sender, RoutedEventArgs e)
        {
            AccediAlControllo(4);
        }

        private void _5_Click(object sender, RoutedEventArgs e)
        {
            AccediAlControllo(5);
        }

        private void _6_Click(object sender, RoutedEventArgs e)
        {
            AccediAlControllo(6);
        }

        void AccediAlControllo(byte Indice)
        {
            // accedo in modo non selettivo, cancello tutte le Text
            foreach (Object Tex in Canvas2.Children)
            {
                // non ho bisogno di if perché in Canvas2 ho messo solo TextBox
                ((TextBox)Tex).Text = "";
            }

            // accedo in modo non selettivo, imposto tutti i rettangoli a bianco
            foreach (Object Rct in Canvas1.Children)
            {
                // non ho bisogno di if perché in Canvas1 ho messo solo rettangoli
                ((Rectangle)Rct).Fill = Brushes.White;
            }

            // trasformo l'indice in Base(0)
            Indice -= 1;

            //accedo ai controlli in modo selettivo

            // sintassi C# WPF per raggiungere il controllo Rectangle[Indice] nel Canvas1
            ((Rectangle)Canvas1.Children[Indice]).Tag = (Indice + 1).ToString(); // scrivo nella proprietà .Tag del controllo
            ((Rectangle)Canvas1.Children[Indice]).Fill = Colore[Indice]; // cambio una proprietà del controllo

            // controllo TextBox[Indice] nel Canvas2                       controllo Rectangle[Indice] nel Canvas1
            ((TextBox)Canvas2.Children[Indice]).Text = "Rettangolo N." + ((Rectangle)Canvas1.Children[Indice]).Tag;
        }
    }
}