0

WPF には、リボンを含む非常に巨大なアプリケーションがあります。リボンには一連の RibbonControls が含まれており、それぞれが異なるコマンドにバインドされています。すべてのコントロールに、ToolTip を配置します。これらの ToolTip テンプレートをオーバーライドして独自のコントロールを使用し、より多くの情報を提供します。il を superToolTip と呼ぶことができます。

ツールチップ テンプレートのオーバーライドは問題なく機能しています。ここで、ツールチップの表示方法を統一したいと考えています。つまり、アプリケーション内のすべてのツールチップに対して同じ initialShowDelay、ShowDuration などが必要です (リボン以外の場所にツールチップがあり、リボンのものと同じ自家製のコントロールを使用します)。そこで、ToolTipService.InitialShowDelay、ToolTipService.BetweenShowDelay、ToolTipService.ShowDuration プロパティをアプリケーションのグローバル定数にバインドしました。

InitialShowDelay : プロパティ InitialShowDelay は、アプリケーション内のほぼすべてのコントロールで正常に機能しています...唯一機能していないのは、デフォルト値の 400 を保持する RibbonSplitButton です...

BetweenShowDelay : プロパティ BetweenShowDelay は、ツールチップが ListBoxItem にある場合に問題なく機能しますが、リボンや独自の複雑なコントロール (プロパティ グリッド) では機能しません。

これらのプロパティは、ツールヒント自体ではなく、ツールヒントが設定されているコントロールで設定されます。

正直なところ、なぜこのように動作しているのかまったくわかりません...これを引き起こす原因や解決方法について何か考えがある人はいますか?

さらに情報が必要な場合は、お気軽にお問い合わせください。私は本当にこれについて必死です.

どうもありがとうございました!

4

3 に答える 3

2

問題は、BetweenShowDelay の条件が尊重されなかったことです。プロパティ「ToolTip」に値を設定する必要があります。この場合、テンプレートを使用していたため、値は null でした。この方法で解決できます:

<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                    <Utils:ToolTipControl DataContext="{Binding ToolTipInfo}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

次に、ダミーを指定されたボタンに配置します。

    <!-- RibbonButton -->
<Style TargetType="{x:Type ribbon:RibbonButton}" BasedOn="{StaticResource RibbonControlStyle}"  >

    <Style.Triggers>
        <DataTrigger Value="true" >
            <DataTrigger.Binding>
                <Binding Converter="{StaticResource IsBoundConverter}" />
            </DataTrigger.Binding>
            <Setter Property="Command" Value="{Binding}" />
            <Setter Property="ribbon:RibbonControlService.Label" Value="{Binding Name}" />
            <Setter Property="ribbon:RibbonControlService.SmallImageSource" Value="{Binding Icon}" />
            <Setter Property="ribbon:RibbonControlService.LargeImageSource" Value="{Binding LargeIcon}" />
            <Setter Property="Visibility" Value="{Binding Visibility}" />
            <Setter Property="ToolTip" Value="dummy"/> <!-- Use dummy value to force tooltip to show and to Bind the tooltip-->
        </DataTrigger>
        <DataTrigger Value="false" >
            <DataTrigger.Binding>
                <Binding Converter="{StaticResource IsBoundConverter}" />
            </DataTrigger.Binding>
            <Setter Property="Background" Value="#FF900000" />
        </DataTrigger>
    </Style.Triggers>



</Style>

そうすれば、ダミー値がオーバーライドされます。

:D

于 2012-09-17T18:15:01.643 に答える
1

また、分割ボタンの問題では、PART_HeaderButtonおよびPART_ToggleButtonという名前の分割ボタンの子(2つの部分)にtooltipserviceが設定されていませんでした。したがって、独自のスタイルを作成した場合でも、ribbonsplitボタンのスタイルによってオーバーライドされます(splitbutton.xamlファイルについては次のリンクを参照してください:

https://wpfcontrolextension.svn.codeplex.com/svn/trunk/Common/RibbonControlsLibrary/v3.5/Themes/Generic.xaml

したがって、このオーバーライドの問題を回避するには(パーツに直接アクセスできないため、コードを経由する必要があります。私の場合、RibbonSplitButtonクラスとOnLoadTemplateメソッドをオーバーライドしました。これにより、getchildを使用してのプロパティにアクセスできます。分けて、それらを変更します。

 public partial class DuniaRibbonSplitButton : RibbonSplitButton
{
    public DuniaRibbonSplitButton()
    {
        InitializeComponent();
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        var HeaderButton = base.GetTemplateChild("PART_HeaderButton");
        var ToggleButton = base.GetTemplateChild("PART_ToggleButton");

        OverrideAttributes(HeaderButton as Control);
        OverrideAttributes(ToggleButton as Control);
    }

    private void OverrideAttributes(Control control)
    {
        control.ToolTip = "Dummy";
        ToolTipService.SetInitialShowDelay(control, ToolTipViewModel.ToolTipInitialDelay);
        ToolTipService.SetShowDuration(control, ToolTipViewModel.ToolTipShowDuration);
        ToolTipService.SetBetweenShowDelay(control, ToolTipViewModel.ToolTipBetweenShowDelay);
    }
}
于 2012-09-19T13:01:19.883 に答える
1

ツールチップをどのように実装したかを示すコードを次に示します

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ribbon="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon"
...>
...
<!-- Ribbon Tooltips Style -->
    <Style TargetType="ribbon:RibbonToolTip">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Utils:ToolTipControl DataContext="{Binding ToolTipInfo}"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
...
<!-- RibbonControl -->
    <Style x:Key="RibbonControlStyle">
        <Setter Property="ribbon:RibbonControlService.ToolTipTitle" Value="dummy" /><!-- Use dummy value to force tooltip to show -->
        <Setter Property="ToolTipService.InitialShowDelay" Value="{x:Static Utils:ToolTipViewModel.ToolTipInitialDelay}"/>
        <Setter Property="ToolTipService.ShowDuration" Value="{x:Static Utils:ToolTipViewModel.ToolTipShowDuration}"/>
        <Setter Property="ToolTipService.BetweenShowDelay" Value="{x:Static Utils:ToolTipViewModel.ToolTipBetweenShowDelay}"/>
        <!-- This style is used to select the "Editors" tab when opening Editor without a world, and to select the "Home" tab otherwise -->
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsWorldLoaded, Source={x:Static ViewModels:ViewportSettingsViewModel.Instance}}" Value="false">
                <Setter Property="ribbon:Ribbon.SelectedIndex" Value="2"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsWorldLoaded, Source={x:Static ViewModels:ViewportSettingsViewModel.Instance}}" Value="true">
                <Setter Property="ribbon:Ribbon.SelectedIndex" Value="0"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
于 2012-08-17T12:50:57.583 に答える