Я пишу небольшой набор инструментов для общих задач vSphere.На этот раз я хотел окунуться в WPF.Я создал начальный графический интерфейс подключения к серверу, и все работает, как задумано.Но теперь я застрял в следующем:
Когда я нажимаю кнопку Connect
(btnConnect
), я хочу, чтобы она стала серой / отключенной, а затем попытка подключения.Как только попытка завершена, она может снова стать активной.Это сделано для того, чтобы люди не нажимали на нее несколько раз подряд.
Это моя первая попытка (я не могу показать полную вещь, учитывая, что это 4 файла и есть кое-что вэто то, что мне не разрешено свободно делиться, поэтому я опубликую то, что уместно) :
$Window.btnConnect.Add_Click({
$Window.btnConnect.IsEnabled = $False
$Window.btnConnect.Content = 'Connecting...'
Connect-CompanyVIServer -VIServer 'ServerName' -VICredential 'PSCredentialObject'
$Window.btnConnect.Content = 'Connect'
$Window.btnConnect.IsEnabled = $True
})
По сути, я отключаю кнопку, измените ее текст на Connecting...
и подключитесь к серверу VMware vCenter.После этого я изменяю метку кнопки назад и снова включаю ее.
Когда я нажимаю на кнопку, форма зависает во время загрузки и выполнения попытки подключения.Этого и следовало ожидать, поскольку они находятся в одной теме.Это нормально, поскольку форма должна что-либо делать до тех пор, пока попытка не будет завершена в любом случае (а одновременное изучение как WPF, так и пространств выполнения сделает ее слишком сложной) .
Проблема в том, что дажехотя $Window.btnConnect.IsEnabled = $False
находится вверху, форма фактически не обновляется, пока не закончится обработка всего блока.До этого времени я могу продолжать нажимать на кнопку, и она будет просто буферизовать попытки и выполнять их друг за другом.
Поэтому я решила разделить их на отдельные события:
$Window.btnConnect.Add_Click({ $Window.btnConnect.IsEnabled = $False })
$Window.btnConnect.Add_IsEnabledChanged({
If ($Window.btnConnect.IsEnabled -eq $False) {
$Window.btnConnect.Content = 'Connecting...'
Connect-CompanyVIServer -VIServer 'ServerName' -VICredential 'PSCredentialObject'
$Window.btnConnect.Content = 'Connect'
$Window.btnConnect.IsEnabled = $True
}
})
Доблестная попытка, однако не сработала.Я получаю то же самое.
Так что теперь у меня нет идей.Я рассматривал возможность записи триггера в код WPF для отключения кнопки, но я понятия не имею, работает ли это.Если я сделаю что-нибудь для асинхронного запуска попытки соединения, мне нужно будет как-то запросить результат.Я все еще экспериментирую.Тем временем я прихожу сюда за помощью.
Моя цель - открыть новое окно, как только будет установлено соединение, и затем позволить ему закрыть это окно.Важным моментом является то, что я запрещаю пользователям нажимать на кнопку более одного раза.
Кто-нибудь?