Как сделать так, чтобы метод WinForms ToolTip.Show не отображал предыдущую строку всплывающей подсказки в течение доли секунды? - PullRequest
1 голос
/ 07 октября 2019

Я столкнулся с этой проблемой при попытке создать настраиваемую систему всплывающих подсказок для настраиваемой системы тестирования попаданий OxyPlot. Пример кода приведен ниже, он перемещает курсор мыши автоматически при обработке события Form.Click, чтобы показать проблему.

Шаги для воспроизведения

  1. создать пустую форму (пример размера:500x500)
  2. обрабатывать событие Click формы
  3. при нажатии
    1. показывать строку всплывающей подсказки «test 1»
    2. перемещать мышь
    3. скрыть подсказку
    4. подождать несколько секунд
    5. показать строку подсказки в две строки "test 123456789 \ n \ nanother line"

В течение доли секунды строка «test 1» в одну строку отображается и в последней позиции курсора.

Запись экрана (в ней проблема не видна)

screen recording

Код

public partial class Form1 : Form
{
    private ToolTip toolTip;

    public Form1()
    {
        InitializeComponent();

        Click += Form1_Click;

        toolTip = new ToolTip();
        toolTip.UseAnimation = false;
        toolTip.UseFading = false;
    }

    private void Form1_Click(object sender, EventArgs e)
    {
        _ = DoIt();
    }

    private async Task DoIt()
    {
        Point pos = PointToClient(MousePosition);
        pos.Y += Cursor.Current.Size.Height;

        // Without the -2000, the duration of the tooltip is too long (because of the fade-in/out animation)
        toolTip.Show("test", this, pos, Math.Max(0, toolTip.AutoPopDelay - 2000));

        await Task.Delay(5000);

        Cursor.Position = new Point(Cursor.Position.X + 100, Cursor.Position.Y);

        toolTip.Hide(this);

        Application.DoEvents();

        await Task.Delay(5000);


        pos = PointToClient(MousePosition);
        pos.Y += Cursor.Current.Size.Height;

        toolTip.Show("test 123456789\n\nanother line", this, pos, Math.Max(0, toolTip.AutoPopDelay - 2000));
    }
}

То, что я пытался

Я сделал пример кода выше, чтобы показать проблему ... Я также искал наStackOverflow и не нашел что-то, чтобы помочь мне.

Ожидаемый результат

Вторая подсказка отображается как первая подсказка, безмигающее изображение предыдущей строки подсказки.

Фактический результат

Старая строка подсказки мигает вместо новой строки подсказки. Это не очень хорошо видно, в основном, когда анимация включена, но это все еще уродливо для меня.

Идеи возможных решений

  1. Используйте таймер или какой-нибудь трюк с async-await.
  2. Создайте два чередующихся объекта всплывающей подсказки.

Конфигурация системы

Я использую для этого .NET Framework v4.5.2, но я попробовал код выше с .NETFramework v4.7.2 и у него та же проблема. Я использую Windows 10 и VS 2019.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...