如何解决工具提示初始延迟无法在WPF中使用?
我在WPF中创建了四个按钮。我为每个按钮使用工具提示。我给工具提示一个初始延迟值。当我第一次将鼠标悬停在这些按钮中的任何一个上时,初始延迟都起作用,但是当我将一个按钮移至另一个按钮时,不会触发任何初始延迟。当我将鼠标光标从一个按钮控件移动到另一个按钮控件时,我想禁用工具提示。但不幸的是,它不起作用。
<Button
Style="{StaticResource RoundCorner}"
Name="button1"
Width="71"
HorizontalAlignment="Left"
Margin="381,14,0"
Height="24"
VerticalAlignment="Top"
UseLayoutRounding="True"
RenderOptions.ClearTypeHint="Enabled"
RenderOptions.BitmapScalingMode="NearestNeighbor"
SnapsToDevicePixels="True"
ToolTipService.InitialShowDelay="1000"
ToolTipService.BetweenShowDelay="0"
ToolTipService.ShowDuration="7000">
<Button.Content>
<TextBlock FontSize="10" FontFamily="Segoe UI" UseLayoutRounding="True" TextOptions.TextFormattingMode="Display">
Help
</TextBlock>
</Button.Content>
<Button.ToolTip>
<ToolTip UseLayoutRounding="True" RenderOptions.ClearTypeHint="Enabled" RenderOptions.BitmapScalingMode="NearestNeighbor" SnapsToDevicePixels="True" TextOptions.TextFormattingMode="Display">
<StackPanel>
<TextBlock FontFamily="Segoe UI" FontSize="12" TextOptions.TextFormattingMode="Ideal" >
Help
</TextBlock>
</StackPanel>
</ToolTip>
</Button.ToolTip>
</Button>
解决方法
问题是由光标在带有工具提示的元素之间花费的时间所引起的。如果没有时间或时间很短,则忽略InitialShowDelay。这主要是因为tooltipservice尚未关闭第一个tooltip,并且仍打开了tooltip。它只是获取下一个按钮的工具提示内容。
简单的解决方案是按钮之间的空隙。
这可以确保在鼠标悬停在带有工具提示的另一个元素上之前,先前的工具提示已关闭。
因此,如果您尝试以下操作:
<StackPanel>
<Button Content="Apple"
ToolTipService.InitialShowDelay="1000"
ToolTipService.BetweenShowDelay="2"
ToolTip="An Apple"
Margin="5"
/>
<Button Content="Banana"
ToolTip="A Banana"
ToolTipService.InitialShowDelay="1000"
ToolTipService.BetweenShowDelay="2"
Margin="5"
/>
<Button Content="Carrot"
ToolTip="Orange Carrot"
ToolTipService.InitialShowDelay="1000"
ToolTipService.BetweenShowDelay="2"
Margin="5"
/>
</StackPanel>
按钮之间有间隙,如果将光标从第一个按钮移动到第二个按钮,则会有延迟。
在图片中,请注意按钮之间有缝隙。
如果删除所有按钮上的空白,当您将鼠标从第一个按钮移到第二个按钮时,第二个工具提示将立即显示。
如果您只能有很小的差距,那么就需要一个更为复杂的解决方案。您需要在鼠标离开按钮之一后立即使工具提示为空或关闭。
一种方法是使用触发器。 触发器在满足逻辑要求时设置属性,因此请使用样式将属性设置为null,以便在触发器为false时将其设置为null。 当鼠标悬停在按钮上时,将工具提示设置为一个值。 因此,只有当鼠标悬停在按钮上时,该按钮才具有工具提示,并且我们的第一个工具提示将在鼠标移开按钮后立即为空。
您需要在某个地方放置工具提示标记,并且可以添加附加属性,但是以下解决方案使用按钮Tag。
最小或无间隙:
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="ToolTip" Value="{x:Null}" />
<Setter Property="ToolTipService.InitialShowDelay" Value="1000"/>
<Setter Property="ToolTipService.BetweenShowDelay" Value="0"/>
<Setter Property="Margin" Value="1"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ToolTip" Value="{Binding Tag,RelativeSource={RelativeSource Self}}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<StackPanel>
<Button Content="Apple">
<Button.Tag>
<TextBlock Text="This textBlock illustrates a more sophisticated tag" FontFamily="Segoe UI" FontSize="12"/>
</Button.Tag>
</Button>
<Button Content="Banana"
Tag="A Banana"
/>
<Button Content="Carrot"
Tag="Orange Carrot"
/>
</StackPanel>
</Grid>
请注意,第一个按钮使用点符号来说明如何将所需的标记放入标签内,而不仅仅是第二个和第三个按钮使用的字符串。
如果您希望某个样式合并其他样式中的设置,则可以使用BasedOn:
<Style TargetType="{x:Type Button}" x:Key="RoundCorner">
.....
</Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource RoundCorner}">
此样式没有键,因此将应用于其范围内的所有按钮。如果您不希望将样式应用于某些按钮,则可以为其指定一个键。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。