我在WPF中有一个非常非常庞大的应用程序,其中包含一个Ribbon。功能区包含一堆RibbonControl,每个都绑定到不同的命令。在每个控件上,我们都放了一个ToolTip。我们重写了这些ToolTip模板以使用我们自己的控件,它提供了更多信息。我们可以称il为superToolTip。
工具提示模板的覆盖工作正常。现在我们要统一工具提示的显示方式。我的意思是我们想要为应用程序中的每个工具提示使用相同的initialShowDelay,ShowDuration等(除了功能区之外还有工具提示,它使用与功能区相同的自制控件)。因此,我将ToolTipService.InitialShowDelay,ToolTipService.BetweenShowDelay,ToolTipService.ShowDuration属性绑定到应用程序中的全局常量。
InitialShowDelay: InitialShowDelay属性几乎适用于应用程序中的每个控件......唯一不起作用的是RibbonSplitButton,它保持默认值为400 ......
BetweenShowDelay: 当工具提示在ListBoxItem上时,BetweenShowDelay属性工作得很好......但是在Ribbon中也没有工作,也没有在我们自己的复杂控件(属性网格)中工作。
这些属性是在设置工具提示的控件中设置的,而不是工具提示本身。
老实说,我绝对没有理由为什么它会这样表现......任何人都知道可能导致这种情况或如何解决这个问题?
如果您需要更多信息,请不要犹豫,我真的很绝望。
非常感谢!
答案 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文件的此链接:
所以为了绕过这个压倒一切的问题(因为我们无法直接访问该部分,我们必须通过代码。我的情况,我覆盖了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);
}
}