WPF ユーザインタフェースコントロールとフォーム間の呼び出し方法

WPFでは、ユーザーコントロールとフォーム間は、以下の方法で呼び出しができます。

  1. ユーザーコントロールにてイベントを定義:
  2. partial class MyUserControl : UserControl
    {
    public event EventHandler MyEvent;public MyUserControl()
    {
    InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
    MyEvent?.Invoke(this, EventArgs.Empty);
    }
    }

  3. ウィンドウ内のイベント用のサブスクリプション
  4. public partial class MainWindow : Window
    {
    public MainWindow()
    {
    InitializeComponent();
    myUserControl.MyEvent += MyEventHandler;
    }private void MyEventHandler(object sender, EventArgs e)
    {
    // ユーザーコントロールのイベント処理
    }
    }
  5. コントロール内で公開メソッドとして定義する方法:
  6. public partial class MyUserControl : UserControl
    {
    public MyUserControl()
    {
    InitializeComponent();
    }public void DoSomething()
    {
    // 何らかの操作を実行
    }
    }
  7. フォームでメソッドを呼び出す:
  8. public partial class MainWindow : Window
    {
    public MainWindow()
    {
    InitializeComponent();
    }private void Button_Click(object sender, RoutedEventArgs e)
    {
    myUserControl.何か処理をする();
    }
    }
  9. ユーザコントロールにて依存関係プロパティを設定することで、フォームから同プロパティへのデータバインディングを設定することができます。プロパティが変更されたら、フォームにて最新の値を取得して処理することができます。
  10. public partial class MyUserControl : UserControl
    {
    public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register(“MyProperty”, typeof(string), typeof(MyUserControl), new PropertyMetadata(default(string)));public string MyProperty
    {
    get { return (string)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
    }

    public MyUserControl()
    {
    InitializeComponent();
    }
    }

  11. ウィンドウ内でデータバインディングを行なう。
  12. フォームにデータソースを設定し、データ変更を処理する:
  13. public partial class MainWindow : Window, INotifyPropertyChanged
    {
    string myPropertyInMainWindow;
    public string MyPropertyInMainWindow
    {
    get => myPropertyInMainWindow;
    set
    {
    myPropertyInMainWindow = value;
    OnPropertyChanged(nameof(MyPropertyInMainWindow));
    // プロパティ変更の処理
    }
    }public MainWindow()
    {
    InitializeComponent();
    DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    }

ユーザーコントロールとフォーム間の呼び出しによく用いられる方法をいくつか示しましたので、実際のニーズに合わせて適切な方法をお選びください。

bannerAds