Улучшение отзывчивости пользовательского интерфейса в приложении Windows Form - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я работаю над проектом и решил создать пользовательский интерфейс для него, используя Visual Studio с приложением Windows Forms (Visual Basic).

Проблема, с которой я сталкиваюсь, заключается в том, что пользовательский интерфейс не реагирует так быстро и гладко, как хотелось бы. В основном, я использую картинки в качестве кнопок, чтобы пользовательская форма выглядела более современной. Однако, когда я наводю указатель мыши на «кнопку», требуется некоторое время, пока не появится «выделенная кнопка».

P1 - изображение «обычной кнопки», а P2 - изображение «выделенной кнопки».

Вот краткий код, который у меня есть:

Public Class Main

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


End Sub

Private Sub PictureBox1_MouseHover(sender As Object, e As EventArgs) Handles P1.MouseHover
    P1.Visible = False
    P2.Visible = True
End Sub

Private Sub P2_MouseClick(sender As Object, e As MouseEventArgs) Handles P2.MouseClick
    'Call cmdInit()
    'Call cmdConnectRobot()
    'Call cmdUnlock()
End Sub

Private Sub Main_MouseHover(sender As Object, e As EventArgs) Handles Me.MouseHover
    If P2.Visible = True Then
        P2.Visible = False
        P1.Visible = True
    End If
End Sub

Private Sub P4_Click(sender As Object, e As EventArgs) Handles P4.Click

End Sub
End Class

Другая проблема, с которой я сталкиваюсь, заключается в том, что при вызове других подпрограмм пользовательская форма перестает отвечать на запросы, когда подпрограмма работает. Я исследовал и обнаружил, что могу реализовать многопоточность или асинхронные задачи, но я немного растерялся и был бы чрезвычайно признателен, если бы кто-то мог направить меня или указать мне правильное направление.

Спасибо заранее !!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

В этом случае ваш пользовательский интерфейс реагирует, однако событие MouseHover возникает только после того, как курсор мыши наведен на элемент управления в течение определенного периода времени (по умолчанию 400 мс), что является причиной задержки.

То, что вы ищете, это MouseEnter событие , которое возникает, как только курсор вводит («касается») элемент управления:

Private Sub P1_MouseEnter(sender As Object, e As EventArgs) Handles P1.MouseEnter
    P1.Visible = False
    P2.Visible = True
End Sub

Затем вы можете использовать это вместе с событием MouseLeave во втором графическом окне, чтобы переключиться обратно на невыделенное изображение:

Private Sub P2_MouseLeave(sender As Object, e As EventArgs) Handles P2.MouseLeave
    P1.Visible = True
    P2.Visible = False
End Sub

Однако переключение таких графических окон не является оптимальным. Я рекомендую вам посмотреть, как вы можете использовать Ресурсы приложений , а затем изменить свой код так, чтобы переключать только изображение, отображаемое одним графическим блоком.

Вот основные шаги:

  1. Щелкните правой кнопкой мыши свой проект в Solution Explorer и нажмите Свойства .

  2. Выберите вкладку Ресурсы .

  3. Чтобы добавить изображение, либо:

    а. Перетащите изображение на панель ресурсов.

    б. Нажмите стрелку рядом с кнопкой Добавить ресурс ... и нажмите Добавить существующий файл ... .

Теперь, в вашем коде добавьте это прямо под Public Class Form1:

Dim ButtonNormal As Image = My.Resources.<first image name>
Dim ButtonHighlighted As Image = My.Resources.<second image name>

Замените <first image name> и <second image name> именами изображений ваших кнопок.

Теперь вам нужна только одна графическая рамка для кнопки:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    P1.Image = ButtonNormal
End Sub

Private Sub P1_MouseEnter(sender As System.Object, e As System.EventArgs) Handles P1.MouseEnter
    P1.Image = ButtonHighlighted
End Sub

Private Sub P1_MouseLeave(sender As System.Object, e As System.EventArgs) Handles P1.MouseLeave
    P1.Image = ButtonNormal
End Sub
0 голосов
/ 16 мая 2018

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

Imports System.Threading
Public Class Form1
Dim WorkerThread As New Thread(AddressOf DoWork)

«WorkerThread» может быть любым именем, а «DoWork» - именем подпрограммы, которую вы хотите запустить в новом потоке, и запускается с помощью вызова:

WorkerThread.start()

Однако есть одна загвоздка: новый поток не может напрямую взаимодействовать с GUI, поэтому вы не можете изменить текстовое поле и т. Д. Я считаю, что самый простой способ внести изменения в GUI - это перетащить таймер на вашей формы и с новыми переменными изменения потока (предварительно определенными чуть ниже Public Class Form1), затем используйте событие Tick Timer1 для мониторинга переменных и обновления GUI, если есть какие-либо изменения.

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