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

时间:2017-09-06 07:04:17

标签: c# wpf xaml tooltip

考虑以下简单代码。

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

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

MainWindow.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>

MainWindow.xaml.cs

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 个答案:

答案 0 :(得分:2)

我担心你误解了BetweenShowDelay属性是如何运作的。正如您可以阅读here

  

在[...]示例中,InitialShowDelay属性设置为1   秒(1000毫秒)和BetweenShowDelay设置为2   两个Ellipse控件的工具提示的秒数(2000毫秒)。   如果显示其中一个省略号的工具提示,然后移动   鼠标指针在两秒钟内指向另一个椭圆并在其上暂停,   第二个椭圆的工具提示立即显示。

请查看上面链接中的示例以获取更多详细信息。

所以 - 正如你所看到的 - 你描述的是正常行为。

答案 1 :(得分:0)

这似乎对我有用,即不设置ToolTipService.BetweenShowDelay属性:

<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>

答案 2 :(得分:0)

我还看到了OP在质疑的行为。我添加属性ToolTipService.BetweenShowDelay的全部原因是因为我认为它会修复问题,但是正如这里所说的,我们误会了它的作用。

这也许是WPF中的一个错误,因为即使不设置BetweenShowDelay,鼠标移动到另一个元素的瞬间,工具提示也会改变,而不是先前的工具提示关闭然后等待打开新的提示。 / p>

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