none
EventHandlerの依存関係プロパティについて RRS feed

  • 質問

  • 表題のとおり、データ型の依存関係プロパティは理解しておりますが、EventHandlerの依存関係プロパティはどのように作成するのでしょうか。

    利用方法としてはカスタムしたUserControlにウィンドウ側からEventHandlerを登録して、ウィンドウ側で処理を行いたいと思っております。

    2016年7月13日 13:27

回答

  • 簡単にするならbuttonという名前のButtonのFieldModifierをpublicにすればbuttonという名前のパブリックフィールドができます。

    <UserControl x:Class="WpfApplication1.UserControl1" 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" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <Grid>
            <Button x:Name="button" x:FieldModifier="public" />
        </Grid>
    </UserControl>
    あるいはUserControlがイベントとして内側のボタンに登録してやればいいです。

    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
    
        public event RoutedEventHandler ButtonClick
        {
            add
            {
                this.button.Click += value;  //buttonという名前のボタンが定義されているとして 
            }
            remove
            {
                this.button.Click -= value;
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年7月14日 14:26

すべての返信

  • それが本当に必要であれば、他の依存関係プロパティと同じように作成することは可能です。

    が、普通に考えると、単純にイベントとして公開すれば良いんじゃないでしょうか。何かイベントで実装すると不都合なことがありますか?

    2016年7月13日 23:35
  • 普通のイベントでもXAMLでイベントハンドラを結びつけることができます。正確にはコマンドを使用しますのでイベントハンドラではないですが・・・
    例えば、以下を参考にしてみて下さい。

    コントロールの任意のイベントとコマンド xaml上で関連付ける
    http://www.pine4.net/Memo/Article/Archives/417

    #Visual Studio 2015だと、System.Windows.Interactivity.dllを使うためにExpression Blend SDK のダウンロードとインストールを行う必要が無く、最初から同梱されていたような気もします。うろ覚えで申し訳ないです。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年7月14日 0:24
    モデレータ
  • わかりづらい質問&知識不足で申し訳ありません。

    UserControl内に配置されたButtonコントロールのクリックイベントを、MainWindow側で実装された関数をコールさせるようにしたいと思っております。

    以下のようなイメージ

    UserControl.button1.Click += MainWindow.CustomMethod;

    上記のようなことを行う場合、どのような手法が一般的でしょうか。

    2016年7月14日 12:30
  • 簡単にするならbuttonという名前のButtonのFieldModifierをpublicにすればbuttonという名前のパブリックフィールドができます。

    <UserControl x:Class="WpfApplication1.UserControl1" 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" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <Grid>
            <Button x:Name="button" x:FieldModifier="public" />
        </Grid>
    </UserControl>
    あるいはUserControlがイベントとして内側のボタンに登録してやればいいです。

    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
    
        public event RoutedEventHandler ButtonClick
        {
            add
            {
                this.button.Click += value;  //buttonという名前のボタンが定義されているとして 
            }
            remove
            {
                this.button.Click -= value;
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年7月14日 14:26
  • ご返信が遅くなりました。

    UserControl側には3rd Partyのライブラリを使用することを想定しておりましたので、eventを作成する方法がよさそうです。

    ご回答ありがとうございました。

    2016年7月16日 8:50