如何使System.Windows.Controls.Tooltip立即淡出?

时间:2012-09-26 22:44:41

标签: c# .net wpf

我有一个带有一些工具提示按钮的应用程序。其中一个按钮(以下称为“运行”按钮)在按下时会启动应用程序外部的触发过程。因为我的应用程序需要从这些进程的输出中获取数据,所以我暂停它直到所有进程都运行完毕,然后在没有进一步用户干预的情况下获取数据。当然,这意味着我的应用程序在外部进程运行时挂起,但这没什么大不了的,因为用户可以点击并处理应用程序之外的其他内容;我的申请落到了后台。不幸的是,与“运行”按钮关联的工具提示不会落到后台,并且在我的代码停止执行之前它不会消失。

以下代码略有帮助:

private void RunButton_Click(object sender, RoutedEventArgs e)
{
    /*Gets the tooltip out of the way while running, otherwise it will stay in front of   everything until the optimizers finish.*/
    ToolTipService.SetShowDuration(runButton, 0);
    RunTooltip.IsOpen = false;//Doesn't close fast enough. It fades a little then hangs there until the code stop running. googling has been remarkably unhelpful.
    Run();
    ToolTipService.SetShowDuration(runButton, 5000);
}

RunTooltip是相关工具提示的名称。将持续时间设置为0或将isOpen设置为false具有相同的行为:导致工具提示变为半透明(但仍然高于所有其他窗口,无论如何),直到Run()完成。

似乎有一种方法可以使Windows.Forms.Tooltips(参见http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.usefading.aspx)立即发生工具提示淡入淡出,但WPF工具提示似乎不再是这种情况(http://msdn.microsoft的.com / EN-US /库/ ms617634.aspx)

除了完全删除此按钮的工具提示之外,如何让这个工具提示阻止用户在等待我的应用程序完成时想要做的事情? 感谢

3 个答案:

答案 0 :(得分:1)

可以使用BackgroundWorker,然后在CallBack上加载UI。

BackgroundWorker Class

如果要报告进度链接进程X的Y可以用户ReportsProgress。你可以取消。

答案 1 :(得分:0)

如果我错了,请纠正我,因为我可能会误解你,但听起来你在处理UI的线程中正在做一些计算上昂贵的东西。这个问题的一个更简单的解决方案可能是创建一个这样的工作线程:

    private void button1_Click(object sender, EventArgs e)
    {
        Thread workerThread = new Thread(ExpensiveMethod);
        btnShow.Visible = false;
        workerThread.Start();
    }

    private void ExpensiveMethod()
    {
        for (int i = 0; i < int.MaxValue; i++)
        {

        }

        btnShow.Visible = true;
    }

这意味着处理UI的线程(以及工具提示)可以正常进行,而工作线程正在处理计算成本高昂的东西。

如果我误解了你,请告诉我!

答案 2 :(得分:0)

您可能会在OnClicked事件中更改ToolTip的Popup组件的可见性,但您必须使用VisualTreeHelper来查找ToolTip并且它有点混乱。用户界面仍将被冻结,这不是最佳方式。

这是一条经验法则:如果你冻结用户界面,那你做错了。

你可能想要一个繁忙的指示器来包装你的控件(在codeplex上的WPF Toolkit中有一个很棒的指针)。 WPF使用MVVM模式效果最好(即最干净),但是如果你直接在代码隐藏中工作,就像这样:

void MyButton_Click(object sender, EventArgs e)
{
    var backgroundThread = new Thread(DoWork);
    this.MyBusyIndicator.IsBusy = true;
    backgroundThread.Start();
}

然后在完成工作后,将BusyIndi​​cator设置为不再繁忙。