トップ回答者
C# WPF ToolTipService.SetShowDuration()について

質問
-
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));
以上
- 移動 立花楓Microsoft employee, Moderator 2018年5月30日 3:06 Visual Studio Development > Visual C#
回答
-
>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
すべての返信
-
>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
-
ToolTipServiceは、あるUI要素に対して、ツールチップを表示させるようにするための機能です。
つまり、ToolTipオブジェクトに対してToolTipService.SetShowDurationをした場合、「そのツールチップにマウスオーバーした際に表示されるツールチップ」に対する設定ということになります。
直接ToolTipオブジェクトを使って表示を遅延させるには、マウスカーソルの監視とかが必要なんですかね?(特にそんな要求を覚えたことはないので調べたこともありませんが)
で、XAMLでToolTipServiceを使って、直接にはToolTipを扱わない、でどのような不満があるのでしょうか。