none
C# WPF ToolTipService.SetShowDuration()について RRS feed

  • 質問

  • VS2015 C# WPF .Net4.5 で作成しています。
     1.ToolTipService.SetShowDuration()の挙動について
       下記のコーディング1で、SetShowDuration()をセットしても、実際に動作させると、表示時間がデフォルトの5秒のまま
        指定時間を5秒以下にしても、長くしても変わらない。

     2.確認したこと
       -1.WPF側で、ToolTipService.ShowDuration = "10000" とセットすれば、正常なセットした表示時間になる
       -2.コーディング1のtoolTip.Content = text は正常に表示される。
       -3.コーディング1で、toolTipをセットしたのが、MentuItemだったので、Button に変えたが、挙動は同じ
       -4.ネットで探した、下記 コーディング2では正常に動作する。


     3.お聞きしたいこと
       -1.コーディング1(ToolTipService.SetShowDuration)にどこか悪いところがあるのか(何か足りないのか)
       -2.コーディング2のサイトで、コメントが多く記載されているが、英文読解力少なく、全文把握できていません。
             大半が16bit時代のIntgerの数値の限界について言っていると思われるのですが、本件の私の質問に答えている部分はあるのでしょうか
       -3.コーディング2を採用した場合、すべてのコントロールに同じ、ShowDuration の値を設定する場合は、いいのですが、
             個々のコントロールに割り当てようとしてコーディング2を各々のコントロールに対して、単純に書き加えると、
             実行時、ArgumentExceptionが発生します。追加情報は下記です。
                ”PropertyMetadata は、既に種類 'DependencyObject' に登録されています。”
             個別に何か、初期化のようなものが必要だと思うのですが、わかりません。各々のコントロールに対してtooltipの表示時間を、
             変えるのには、どうしたらいいのでしょうか
    -------------------------
    コーディング1

    WPF側
    <MenuItem Name="menuitem" Header="Test" >

    C#
          string text = "message";
          ToolTip toolTip = new ToolTip();
          toolTip.PlacementTarget = menuitem;
          menuitem.ToolTip = toolTip;
          int showtime = 10000; // msec
          toolTip.Content = text;
          ToolTipService.SetShowDuration(toolTip, showtime);
    --------------------------
      コーディング2
         StackOverFlow より  
    https://stackoverflow.com/questions/896574/forcing-a-wpf-tooltip-to-stay-on-the-screen?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

               ToolTipService.ShowDurationProperty.OverrideMetadata(
               typeof(DependencyObject), new FrameworkPropertyMetadata(10000));

    以上

    2018年5月30日 3:00

回答

  • >1.コーディング1(ToolTipService.SetShowDuration)にどこか悪いところがあるのか(何か足りないのか)

    SetShowDurationの対象にするのはtoolTipではなくmenuitemです。

    string text = "message";
    ToolTip toolTip = new ToolTip();
    toolTip.PlacementTarget = menuitem;
    menuitem.ToolTip = toolTip;
    int showtime = 10000;
    toolTip.Content = text;
    ToolTipService.SetShowDuration(menuitem, showtime); //menuitemに対して設定する

    >2.本件の私の質問に答えている部分はあるのでしょうか

    個々のコントロールに対して個別lの設定をするのであれば、149件くらいvoteされているのが近いでしょう。
    ただこれはXAMLで設定されているので、コードでやるならコーディング1と同等です。

    >3.各々のコントロールに対して、単純に書き加えると、実行時、ArgumentExceptionが発生します

    OverrideMetadataは型に対してのメタデータ(初期値など)を上書き設定します。
    全てのコントロールの基底であるDependencyObject型に対してのメタデータを上書きすると、すべてのコントロールの初期値が変更できるということです。
    MenuItem型に対して上書すればMenuItemだけの初期値を設定することもできます。
    ですが型に対しての設定であって、個々のインスタンスに対して設定するものではないため当然エラーになります。

    個々のインスタンスへの設定はコーディング1の方を使いましょう。


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

    • 回答としてマーク エンバー 2018年5月30日 5:02
    2018年5月30日 3:45

すべての返信

  • エンバーさん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    ご質問内容を拝見すると WPF についてのご質問とのことですので
    WPF フォーラムへ移動させていただきますね。

    それでは皆様からの情報をお待ちください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年5月30日 3:09
    モデレータ
  • >1.コーディング1(ToolTipService.SetShowDuration)にどこか悪いところがあるのか(何か足りないのか)

    SetShowDurationの対象にするのはtoolTipではなくmenuitemです。

    string text = "message";
    ToolTip toolTip = new ToolTip();
    toolTip.PlacementTarget = menuitem;
    menuitem.ToolTip = toolTip;
    int showtime = 10000;
    toolTip.Content = text;
    ToolTipService.SetShowDuration(menuitem, showtime); //menuitemに対して設定する

    >2.本件の私の質問に答えている部分はあるのでしょうか

    個々のコントロールに対して個別lの設定をするのであれば、149件くらいvoteされているのが近いでしょう。
    ただこれはXAMLで設定されているので、コードでやるならコーディング1と同等です。

    >3.各々のコントロールに対して、単純に書き加えると、実行時、ArgumentExceptionが発生します

    OverrideMetadataは型に対してのメタデータ(初期値など)を上書き設定します。
    全てのコントロールの基底であるDependencyObject型に対してのメタデータを上書きすると、すべてのコントロールの初期値が変更できるということです。
    MenuItem型に対して上書すればMenuItemだけの初期値を設定することもできます。
    ですが型に対しての設定であって、個々のインスタンスに対して設定するものではないため当然エラーになります。

    個々のインスタンスへの設定はコーディング1の方を使いましょう。


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

    • 回答としてマーク エンバー 2018年5月30日 5:02
    2018年5月30日 3:45
  • ToolTipServiceは、あるUI要素に対して、ツールチップを表示させるようにするための機能です。

    つまり、ToolTipオブジェクトに対してToolTipService.SetShowDurationをした場合、「そのツールチップにマウスオーバーした際に表示されるツールチップ」に対する設定ということになります。

    直接ToolTipオブジェクトを使って表示を遅延させるには、マウスカーソルの監視とかが必要なんですかね?(特にそんな要求を覚えたことはないので調べたこともありませんが)

    で、XAMLでToolTipServiceを使って、直接にはToolTipを扱わない、でどのような不満があるのでしょうか。

    2018年5月30日 3:50
  • gekka 様

      毎度、お世話になります。

      単純ミスでお恥ずかしい。tooltipのインスタンスを設定するのではなく、tooltipを表示させるコントロールを第一引数に設定するのですね。

    よくわかりました。ありがとうございました。

     手元の、作成中のアプリケーションでも動作を確認しました。

      また、2,3の質問に対しても、丁寧な対応、重ね重ねありがとうございます。

    2018年5月30日 5:08