Windowの子要素を再帰検索する

2021-03-14

MainWindow.xaml

<Window x:Class="WpfApp24.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:WpfApp24"
        mc:Ignorable="d"
        Title="MainWindow" Height="242" Width="409">
    <Grid>
        <TextBox HorizontalAlignment="Left" Height="30" Margin="65,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="90"/>
        <Grid HorizontalAlignment="Left" Height="125" Margin="10,60,0,0" VerticalAlignment="Top" Width="365" Background="#FF66EC49">
            <Grid HorizontalAlignment="Left" Height="60" Margin="10,55,0,0" VerticalAlignment="Top" Width="150" Background="#FFEA7878">
                <TextBox HorizontalAlignment="Left" Height="35" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="105"/>
            </Grid>
            <TextBox HorizontalAlignment="Left" Height="35" Margin="55,15,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="105"/>
            <Grid HorizontalAlignment="Left" Height="60" Margin="190,55,0,0" VerticalAlignment="Top" Width="150" Background="#FF7670F7">
                <TextBox HorizontalAlignment="Left" Height="35" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="105"/>
            </Grid>
        </Grid>

    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;

namespace WpfApp24
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            SetChildren(this, t => {
                if (t is TextBox)
                    ((TextBox)t).Text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
            });
        }

        /// <summary>
        /// 要素にアクションを適用 及び 子要素のリストアップ
        /// </summary>
        /// <param name="targetObject"></param>
        /// <param name="action"></param>
        private void SetChildren(DependencyObject targetObject, Action<DependencyObject> action)
        {
            action(targetObject);

            foreach (object objChild in LogicalTreeHelper.GetChildren(targetObject))
            {
                if (objChild is DependencyObject)
                    SetChildren((DependencyObject)objChild, action);
            }
        }
    }
}