【C# WPF】親WindowのLoaded が呼ばれたとき、子UserContorlのLoadedも呼ぶ

C# WPFアプリケーションにて、親WindowのLoadedイベントが呼ばれたとき、子UserControlのLoadedイベントを呼ぶ方法を書きます。

やり方が分からなくて、少しハマったところでした。

開発環境
  • Windows10
  • Microsoft Visual Studio Community2022
  • .NET 6
  • WPF アプリ
目次

実装する

親WindowのLoadedイベントが呼ばれたとき、子UserControlのLoadedイベントを呼ぶ ためのポイントは、

  • 事前に、親Window内の子UserControlを設定するGridに対し、Childrenフィールドに子UserControlを追加する

です。

コードを見ながらのほうが分かりやすいので、実装していきます。

子UserControl

子UserControlのXaml です。地図記号を登録するためのユーザーコントロールです。

Xamlファイルは以下のようになります。

<UserControl x:Class="ChildUserControlLoad.MapSymbolUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ChildUserControlLoad"
             mc:Ignorable="d" 
             d:DesignHeight="150" d:DesignWidth="250">
    <Grid>
        <GroupBox Header="地図記号登録" Margin="0,0,40,15"/>
        <Label Content="ID : " HorizontalAlignment="Left" Margin="28,41,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Margin="80,49,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="80"/>
        <Label Content="名称 : " HorizontalAlignment="Left" Margin="28,72,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Margin="80,80,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="80"/>
        <Button Content="登録" HorizontalAlignment="Left" Margin="170,105,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1.607,2.104"/>
    </Grid>
</UserControl>

子UserControlの相互作用ロジックのcsファイルは以下のようになります。

Loaded イベントにPage_Loaded メソッドを登録します。親WindowのLoaded イベントが呼ばれたとき、このPage_Loadedメソッドが呼ばれます。

using System.Windows;

namespace ChildUserControlLoad
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private MapSymbolUserControl mapSymbolUserControl;

        public MainWindow()
        {
            InitializeComponent();

            mapSymbolUserControl = new MapSymbolUserControl();
            Grid_MapSymbolUserControl.Children.Add(mapSymbolUserControl);

            Loaded += Page_Loaded;
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {

        }
    }
}

親Window

親WindowのXaml のコードです。Grid_MapSymbolUserControl Gridに子ユーザーコントロールを設定します。

<Window x:Class="ChildUserControlLoad.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:ChildUserControlLoad"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid x:Name="Grid_MapSymbolUserControl"></Grid>
    </Grid>
</Window>

親WindowのXamlの相互作用ロジックのcsファイルは以下のようになります。ここで、子UserControlを設定するGridに対し、Childrenフィールドに子UserControlを追加します。

using System.Windows;

namespace ChildUserControlLoad
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private MapSymbolUserControl mapSymbolUserControl;

        public MainWindow()
        {
            InitializeComponent();

            mapSymbolUserControl = new MapSymbolUserControl();
            Grid_MapSymbolUserControl.Children.Add(mapSymbolUserControl);

            Loaded += Page_Loaded;
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {

        }
    }
}

デバッグする

起動後、親WindowのPage_Loaded メソッドが呼ばれた後、子WindowのPage_Loaded メソッドが呼ばれることを確認できました。

まとめ

C# WPFアプリケーションにて、親WindowのLoadedイベントが呼ばれたとき、子UserControlのLoadedイベントを呼ぶ方法を書きました。

事前に、親Window内の子UserControlを設定するGridに対し、Childrenフィールドに子UserControlを追加するとできます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次