Microsoft.Windows.Controls.Ribbon控件中的WPF ToolTipService属性(BetweenShowDelay等)的问题

时间:2012-08-15 19:07:13

标签: wpf tooltip ribbon

我在WPF中有一个非常非常庞大的应用程序,其中包含一个Ribbon。功能区包含一堆RibbonControl,每个都绑定到不同的命令。在每个控件上,我们都放了一个ToolTip。我们重写了这些ToolTip模板以使用我们自己的控件,它提供了更多信息。我们可以称il为superToolTip。

工具提示模板的覆盖工作正常。现在我们要统一工具提示的显示方式。我的意思是我们想要为应用程序中的每个工具提示使用相同的initialShowDelay,ShowDuration等(除了功能区之外还有工具提示,它使用与功能区相同的自制控件)。因此,我将ToolTipService.InitialShowDelay,ToolTipService.BetweenShowDelay,ToolTipService.ShowDuration属性绑定到应用程序中的全局常量。

InitialShowDelay: InitialShowDelay属性几乎适用于应用程序中的每个控件......唯一不起作用的是RibbonSplitButton,它保持默认值为400 ......

BetweenShowDelay: 当工具提示在ListBoxItem上时,BetweenShowDelay属性工作得很好......但是在Ribbon中也没有工作,也没有在我们自己的复杂控件(属性网格)中工作。

这些属性是在设置工具提示的控件中设置的,而不是工具提示本身。

老实说,我绝对没有理由为什么它会这样表现......任何人都知道可能导致这种情况或如何解决这个问题?

如果您需要更多信息,请不要犹豫,我真的很绝望。

非常感谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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>

答案 2 :(得分:1)

另外,对于splitbutton问题,tooltipservice没有设置为splitbutton(两个部分)的子节点,它们被命名为PART_HeaderButton和PART_ToggleButton。因此,即使您创建自己的样式,它也会被ribbonplit按钮的样式覆盖(请参阅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);
    }
}