none
ToolTip上にボタンを配置した際、クリックできない RRS feed

  • 質問

  • お世話になります。

    ToolTip上にボタンを配置し、そのクリックイベントを拾いたいと思っています。
    以下のようにToolTipを記述しました。

    --
    <TextBlock ToolTipService.VerticalOffset="-40" Text="ツールチップ表示">
        <ToolTipService.ToolTip>
            <Button>クリック</Button>
        </ToolTipService.ToolTip>
    </TextBlock>
    --

    表示されたToolTip上でマウスをクリックするとToolTipが消えてしまい、クリックイベントを拾う事ができません。
    何か良い方法はないでしょうか?
    2009年6月12日 11:34

回答

  • ToolTip のコンテンツは、フォーカスを受け取ることができません。
    なのでクリックイベントなどは発生しません。
    以下のようにするとそれらしいことはできますが、ボタン以外をクリックしてもイベントが発生します。
    もちろん、マウス座標と Button の座標範囲をチェックすればより細かくチェックはできると思いますが、
    Button の形状が四角とは限らないのでめんどくさいのでその部分はやっていません。

    <TextBlock Name="textBlock1" ToolTipService.VerticalOffset="-40" Text="ツールチップ表示">
        <ToolTipService.ToolTip>
            <Button Name="button1">クリック</Button>
        </ToolTipService.ToolTip>
    </TextBlock>
    


    public Window1()
    {
        InitializeComponent();
        InputManager.Current.PostNotifyInput += new NotifyInputEventHandler(Current_PostNotifyInput);
    }
    
    void Current_PostNotifyInput(object sender, NotifyInputEventArgs e)
    {
        if (e.StagingItem.Input.RoutedEvent == Mouse.MouseDownEvent &&
            e.StagingItem.Input.Source == textBlock1 &&
            button1.IsVisible)
        {
            Debug.WriteLine("ToolTipButton_Click");
        }
    }
    

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    • 回答としてマーク higashi4711 2009年6月15日 1:23
    2009年6月14日 0:41

すべての返信

  • ToolTip のコンテンツは、フォーカスを受け取ることができません。
    なのでクリックイベントなどは発生しません。
    以下のようにするとそれらしいことはできますが、ボタン以外をクリックしてもイベントが発生します。
    もちろん、マウス座標と Button の座標範囲をチェックすればより細かくチェックはできると思いますが、
    Button の形状が四角とは限らないのでめんどくさいのでその部分はやっていません。

    <TextBlock Name="textBlock1" ToolTipService.VerticalOffset="-40" Text="ツールチップ表示">
        <ToolTipService.ToolTip>
            <Button Name="button1">クリック</Button>
        </ToolTipService.ToolTip>
    </TextBlock>
    


    public Window1()
    {
        InitializeComponent();
        InputManager.Current.PostNotifyInput += new NotifyInputEventHandler(Current_PostNotifyInput);
    }
    
    void Current_PostNotifyInput(object sender, NotifyInputEventArgs e)
    {
        if (e.StagingItem.Input.RoutedEvent == Mouse.MouseDownEvent &&
            e.StagingItem.Input.Source == textBlock1 &&
            button1.IsVisible)
        {
            Debug.WriteLine("ToolTipButton_Click");
        }
    }
    

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    • 回答としてマーク higashi4711 2009年6月15日 1:23
    2009年6月14日 0:41
  • 返信ありがとうございます。
    なるほど、フォーカスを受け取れないとなれば、ボタンを押す事もできないですよね。
    教えて頂いた方法でも表現を変えればやりたい事は実現できそうですので、大変助かりました。
    ありがとうございました。

    2009年6月15日 1:22