###前提・実現したいこと
WPFコントロール追加時にそのイベントを取得し、そこでログに書き出すなりの動作を行いたいです。
下記はWindowsFormsですが、上記の動作はできています。
しかし、WPFでは該当の処理を実装できませんでした。
WPFでも、WindowsFormsのControlAddedイベントのようにコントロールを追加時にイベントを発生させたいです。
######・WindowsForms
C#
1using System.Windows.Forms; 2 3namespace WindowsFormsApp1 4{ 5 public partial class Form1 : Form 6 { 7 public Form1() 8 { 9 InitializeComponent(); 10 11 this.button1.Click += button1_Click; 12 EventRegister(this); 13 } 14 15 /// <summary> 16 /// 指定したコントロールとその全ての子コントロールにイベントを登録します。 17 /// </summary> 18 /// <param name="control"></param> 19 private void EventRegister(Control control) 20 { 21 control.ControlAdded += Control_ControlAdded; 22 control.MouseDown += Control_MouseDown; 23 24 // 子コントロールにもイベントを登録する 25 foreach (Control child in control.Controls) 26 { 27 EventRegister(child); 28 } 29 } 30 31 private void button1_Click(object sender, System.EventArgs e) 32 { 33 this.panel1.Controls.Add(new Button()); 34 } 35 36 private void Control_ControlAdded(object sender, ControlEventArgs e) 37 { 38 EventRegister(e.Control); 39 } 40 41 private void Control_MouseDown(object sender, MouseEventArgs e) 42 { 43 // マウスダウンを実行したということをログに記載する 44 } 45 } 46}
######・WPF
XML
1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <WrapPanel Name="MainWrapPanel"> 10 <Button Name="button1" Content="Button" Margin="10" Height="20" Width="75"/> 11 </WrapPanel> 12</Window>
C#
1using System.Windows; 2 3namespace WpfApp1 4{ 5 /// <summary> 6 /// MainWindow.xaml の相互作用ロジック 7 /// </summary> 8 public partial class MainWindow : Window 9 { 10 public MainWindow() 11 { 12 InitializeComponent(); 13 14 this.button1.Click += Button_Click; 15 EventRegister(this); 16 } 17 18 /// <summary> 19 /// 指定したコントロールとその全ての子コントロールにイベントを登録します。 20 /// </summary> 21 /// <param name="element"></param> 22 private void EventRegister(FrameworkElement element) 23 { 24 //element.ControlAdded += Control_ControlAdded; // エラーが出る 25 element.PreviewMouseDown += Control_PreviewMouseDown; 26 27 // 子コントロールにもイベントを登録する 28 foreach (var child in LogicalTreeHelper.GetChildren(element)) 29 { 30 if (child is FrameworkElement) 31 { 32 EventRegister(child as FrameworkElement); 33 } 34 } 35 } 36 37 protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) 38 { 39 // このイベントだと、ウィンドウにコントロールが追加されたことしか取得できない 40 base.OnVisualChildrenChanged(visualAdded, visualRemoved); 41 } 42 43 private void Button_Click(object sender, RoutedEventArgs e) 44 { 45 var button = new System.Windows.Controls.Button() 46 { 47 Height = 20, 48 Width = 75, 49 Margin = new Thickness(10), 50 }; 51 MainWrapPanel.Children.Add(button); // 追加したbuttonに対してEventRegisterを実行したい 52 } 53 54 private void Control_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 55 { 56 // マウスダウンを実行したということをログに記載する 57 } 58 } 59}
###試したこと
Stack overflowとMicroSoftドキュメントを参考にしてソースを組んでみましたが、WindowsFormsのようにイベントが発生しませんでした。
開発環境
.NET Framework 4.8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/03 14:36