22

リボン コントロールに 100 以上の異なるツールヒントが設定されているアプリケーションがあります。すべてのツールヒントがかなり早く (約 0.5 秒) ポップアップするので、ポップアップの遅延を増やしたいと考えています。いくつかの調査の後、WPF でこれを行う唯一の方法は、ToolTipService.InitialShowDelay プロパティを使用することです。

私の質問は、XAML を調べて明示的に言う必要があるかどうかです。

ToolTipService.InitialShowDelay="2000"

ToolTip を持つすべての単一のコントロールに対して? または、スタイルのようなものを使用して、このプロパティをグローバルに設定する方法はありますか?

アイデアをありがとう。

4

4 に答える 4

32

残念ながら、これを行う簡単な方法はありません。理想的には、FrameworkElement に ToolTipService.InitialShowDelay を設定し、そこから伝播させますが、うまくいかないようです。

代わりに、設定したい各タイプのコントロールに設定できます。たとえば、次のようになります。

<Style TargetType="RibbonButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonToggleButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonDropDownButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>

これは非常に冗長な方法ですが、少なくともすべてのコントロール自体ではなく、各タイプのコントロールに設定するだけで済みます。リボンで使用している場合は、開始するコントロールはほんの一握りです。と。

値を変更したい場合に備えて、リソース値を使用して上記のコードを設計することをお勧めします。

<sys:Int32 x:Key="ToolTipInitialShowDelay">2000</sys:Int32>
<Style TargetType="RibbonButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>
<Style TargetType="RibbonToggleButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>
<Style TargetType="RibbonDropDownButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>

または、BasedOn スタイルをまだ使用していない場合は、次のように短縮できます。

<Style x:Key="ToolTipDefaults">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonButton" BasedOn="{StaticResource ToolTipDefaults}"/>
<Style TargetType="RibbonToggleButton" BasedOn="{StaticResource ToolTipDefaults}"/>
<Style TargetType="RibbonDropDownButton" BasedOn="{StaticResource ToolTipDefaults}"/>

このアプローチの制限は、スタイルは 1 つの親スタイルにしか基づくことができないため、既にこのパターンを使用している場合、これを行うことはできません。

于 2009-06-04T21:38:05.623 に答える
16

私は同じ問題に遭遇し、かなりの解決策を達成しました。実際、そのうちの2つ。

どちらも DependencyProperty メタデータ システムに基づいています。どちらの場合も、非常によく似た静的初期化コードが必要になります。

public static class ToolTipServiceHelper
{
    static ToolTipServiceHelper()
    {
        ToolTipService.InitialShowDelayProperty
            .OverrideMetadata(typeof(FrameworkElement), 
                              new FrameworkPropertyMetadata(...));
    }
}

"..." の代わりに何が入りますか?

最初の解決策は非常に明白です。実際の値が提供される場所を除いて、アプリケーション全体に適用される目的のデフォルト値をそこに配置します。

2 番目の解決策は難しいものです。"..." の代わりに、デフォルト メタデータからデフォルト値を指定しますが、オプションを変更する以外に、実際にはプロパティを継承可能にする必要があります。

new FrameworkPropertyMetadata(
    ToolTipService.InitialShowDelayProperty.DefaultMetadata.DefaultValue,
    FrameworkPropertyMetadataOptions.Inherits)

プロパティが継承可能な場合、次のようなものを作成できます。

<Window xmlns="..."
        ...
        ToolTipService.InitialShowDelay="2000">
    ...
</Window>

これにより、ウィンドウ全体またはプロパティを適用する他の要素に対してトリックが実行されます。

HTH

于 2009-10-26T05:59:29.897 に答える
9

archimed7592 のソリューションが気に入っていますが、単独では実行されません。クラスの静的コンストラクターを実行するには、何らかの方法でクラスを使用する必要があります。したがって、このコードをアプリケーション Application クラスの静的コンストラクターに次のように配置することにしました。

    static NetFriendApplication()
    {
        ToolTipService.ShowDurationProperty.OverrideMetadata(
            typeof (FrameworkElement), new FrameworkPropertyMetadata(int.MaxValue));
    }

私の場合、別のプロパティを設定する必要がありますが、考え方は同じです。ですから、好奇心を持たないでください。

于 2011-01-24T13:11:41.140 に答える
3

Nicholas Armstrong のソリューションは非常に優れていますが、ToolTipService.IsEnabled を true に設定すると、FrameworkElement のスタイル設定が機能します。

私のプロジェクトでは、すべてのフィールドに共通のスタイルがあり、ToolTip.InitialDelay を設定するのが合理的でしたが、うまくいかなかったので、ToolTip.IsEnabled を試してみました。

以下の例:

<Style x:Key="FieldStyle" TargetType="FrameworkElement">
    <Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
    <Setter Property="ToolTipService.ShowDuration" Value="20000"/>
    <Setter Property="ToolTipService.InitialShowDelay" Value="3000"/>
    <Setter Property="ToolTipService.IsEnabled" Value="True"/>
</Style>
于 2014-07-11T11:49:03.933 に答える