Как заставить окно wpf / обновить обновление отключенных элементов - PullRequest
3 голосов
/ 08 октября 2010

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

Если я использую

private void DoSomething()
{
  HandleBusyEnableDisable(false);
  DoSomethingThatKeepsItBusy();
  HandleBusyEnableDisable(true);
}

private void HandleBusyEnableDisable(bool enabling)
{
  Cursor = enabling ? Cursors.Arrow : Cursors.Wait; 
  CanvasFunctions.IsEnabled = enabling;
  CanvasRight.IsEnabled = enabling;
  CanvasRight.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, EmptyDelegate);

Я вижу изменение курсора, но содержимое не выглядит отключенным. Если я добавлю

CanvasRight.Opacity = enabling ? 1 : .5;

тогда я думаю, что иногда это работает. Есть ли что-то еще, что я могу сделать?
Выполняемая задача проверяет введенные пользователем данные, поэтому ее намного проще запустить в потоке графического интерфейса. Это не должно быть так сложно.

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Не все элементы управления визуально представляют собой отключенные, вы можете заметить, что их нельзя будет использовать со стороны клиента.

Чтобы быть откровенным, вам, вероятно, следует просто внедрить INotifyChanged и связать включенное поле со свойством. Это обеспечит правильное включение / отключение элементов управления, поскольку Binding Framework будет выполнять правильные отправки, поскольку IsEnabled Я полагаю, что зарегистрировано в AffectsRender, что сделает недействительным визуальное состояние элемента управления и приведет к повторному рисованию.

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

<Style TargetType="Grid">
  <Style.Triggers>
    <DataTrigger Property="IsEnabled" Value="False">
       <Setter Property="Opacity" Value="0.5" />
    </DataTrigger>
  </Style.Triggers>
</Style>
0 голосов
/ 08 октября 2010

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

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