当前位置: 首页 > 知识库问答 >
问题:

项目上的WPF工具提示不会重新触发初始延迟

罗翰
2023-03-14

考虑下面的简单代码。

当我将鼠标悬停在任何项目上时,它会等待1秒,然后按预期显示工具提示。但是,如果我将鼠标移动到另一个项目而不退出列表,工具提示只会更新为新的项目名称,而不会重新触发显示延迟。这是正常行为吗?

每当鼠标进入一个新项目并重新触发显示延迟时,我需要在列表中移动鼠标时工具提示消失。有什么建议吗?

主窗口。xaml

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:lcl="clr-namespace:WpfApplication"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Items}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="lcl:Item">
                    <TextBlock 
                        Text="{Binding Name}"
                        HorizontalAlignment="Stretch"
                        ToolTipService.InitialShowDelay="1000"
                        ToolTipService.BetweenShowDelay="1000"
                        ToolTipService.HasDropShadow="True"
                        ToolTipService.HorizontalOffset="5"
                        ToolTipService.VerticalOffset="5">
                        <TextBlock.ToolTip>
                            <TextBlock Text="{Binding Name}" />
                        </TextBlock.ToolTip>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

主窗口。xaml。反恐精英

namespace WpfApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            _Items.Add(new Item() { Name = "First" });
            _Items.Add(new Item() { Name = "Second" });
            _Items.Add(new Item() { Name = "Third" });
        }

        public Collection<Item> _Items = new Collection<Item>();
        public Collection<Item> Items
        {
            get { return _Items; }
        }
    }

    public class Item
    {
        public string Name
        {
            get;
            set;
        }
    }
}

共有3个答案

戎亦
2023-03-14

我也看到了OP质疑的行为。我添加属性ToolTipService的全部原因。BetweenShowDelay是因为我认为它可以解决问题,但正如这里所说的,我们误解了它的作用。

也许这是WPF中的一个错误,因为即使没有设置BetweenShowDelay,当鼠标移动到另一个元素时,工具提示也会发生变化,而不是之前的工具提示关闭,然后等待打开新的。

我想知道这是否与使用数据模板有关?

尹承泽
2023-03-14

这似乎和我预期的一样,也就是说,不要设置ToolTipService。Beween ShowDelay属性:

<TextBlock 
    Text="{Binding Name}"
    HorizontalAlignment="Stretch"
    ToolTipService.InitialShowDelay="5000"
    ToolTipService.HasDropShadow="True"
    ToolTipService.HorizontalOffset="5"
    ToolTipService.VerticalOffset="5">
    <TextBlock.ToolTip>
        <TextBlock Text="{Binding Name}" />
    </TextBlock.ToolTip>
</TextBlock>
澹台逸明
2023-03-14

恐怕您误解了Between ShowDelay属性的工作原理。正如你在这里看到的:

在[……]例如,对于两个椭圆控件的工具提示,InitialShowDelay属性设置为1秒(1000毫秒),BetweenShowDelay设置为两秒(2000毫秒)。如果显示其中一个椭圆的工具提示,然后在两秒内将鼠标指针移动到另一个椭圆并在其上暂停,则第二个椭圆的工具提示将立即显示。

查看上面链接中的示例以了解更多详细信息。

所以——如你所见——你描述的是正常行为。

 类似资料:
  • 我在我的WordPress网站上使用JetPack,并启用了延迟加载。然而,在我的网站中,我用AJAX更新了一些内容,这导致加载1x1占位符的图像,而不是真正的图像,这是懒惰加载会处理的。 如何使用Jet Pack再次调用延迟加载?我似乎记得有一个JavaScript函数,但找不到它是什么。

  • 尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题: } 从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。 试图避免常见的错误: 颜色数组只有在通过扩展运算符从状态复制后才被修改 通过setState()传递新数组 此外,我还处理了两个组件中函数的实例绑定 但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的

  • 我真的很喜欢这个CSS工具提示的解决方案,我自己也用过一段时间了。但是我遇到了一个我以前从未遇到过的问题,多个工具提示的内容相互重叠,我不确定如何最好地解决它。 提到的解决方案基于管理绝对定位工具提示内容的

  • 我在玩JavaFX的< code>Tooltip。我意识到对我个人来说,悬停在某个东西上和工具提示实际出现之间的延迟太长了。从API中可以看出: 通常,当鼠标移动到控件上时,工具提示被“激活”。工具提示从“激活”到实际显示之间通常会有一些延迟。细节(如延迟量等)留给皮肤实现。 经过进一步调查,我无法找到任何控制延迟的可能性。JavaFX CSS Reference没有关于延迟时间的信息,的运行时评

  • 当我悬停在第一个Div上时,工具提示显示得比我悬停在下面两个Div上时更远。显然,这是因为div中的文本更大/更长。但是我不想显示不依赖于悬停文本的工具提示跨度,而是与文本的包含div相关,所以它总是显示在相同的位置。 jQuery不是任何选项,但我认为,这是一个CSS问题。 null null

  • 该站点有带有动态内容的工具提示的链接。我正在使用jquery UI工具提示来显示它们。我不希望每次用户不小心将光标放在链接上时,都显示工具提示。我想要显示工具提示只有当它延迟光标在链接上几秒钟。这应该像Gmail一样,当你悬停在发件人的名字上时,你会看到关于他的信息(见图)。 我需要工具提示,用户可以与之交互,所以我使用了这段代码(感谢Antonimo https://stackoverflow.