0

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

工具提示模板的覆盖工作得很好。现在我们要统一工具提示的显示方式。我的意思是,对于应用程序中的每个工具提示,我们都需要相同的 initialShowDelay、ShowDuration 等(在功能区之外的其他地方也有工具提示,它们使用与功能区相同的自制控件)。因此,我将 ToolTipService.InitialShowDelay、ToolTipService.BetweenShowDelay、ToolTipService.ShowDuration 属性绑定到应用程序中的全局常量。

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

BetweenShowDelay : 当工具提示位于 ListBoxItem 上时,属性 BetweenShowDelay 工作得很好......但在功能区和我们自己的复杂控件(属性网格)中不起作用。

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

老实说,我完全不知道它为什么会这样……任何人都知道什么可能导致这种情况或如何解决它?

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

非常感谢你!

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

这是一些代码,显示了我如何实现我的工具提示

    <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 回答
1

此外,对于 splitbutton 问题,没有为 splitbutton 的子项(两个部分)设置工具提示服务,这两个部分被命名为 PART_HeaderButton 和 PART_ToggleButton。因此,即使您创建自己的样式,它也会被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 回答