В следующем XAML панель редактирования всегда видна.OverlayGrid отображается только тогда, когда длинная операция была запущена нажатием клавиши F5.Визуальный эффект заключается в том, что панель editPanel будет выделена серым цветом, что приведет к длительному процессу.
<Window.InputBindings>
<KeyBinding Key="F5" Command="{Binding Path=RefreshCommand}"/>
</Window.InputBindings>
<Grid>
<StackPanel Name="editPanel">
<TextBox>set focus here to see the problem.</TextBox>
<CheckBox>set focus here to remove the problem.</CheckBox>
<TextBlock Text="{Binding Path=Worker.Message}"/>
</StackPanel>
<Grid Name="overlayGrid"
Visibility="{Binding Path=Worker.Visibility}"
Background="Gray" Opacity="0.5">
<TextBox Text="{Binding Path=Worker.Message}" FontWeight="Bold"
HorizontalAlignment="Center" VerticalAlignment="Center"
/>
</Grid>
</Grid>
OverlayGrid отображается точно так, как ожидается, за исключением случаев, когда TextBox имеет фокус.Если TextBox имеет фокус, длительная операция выполняется до того, как вы увидите быстрое мерцание overlayGrid.Это как если бы код был следующим: проделайте долгую операцию, покажите overlayGrid, сверните overlayGrid.
Код ViewModel, который выполняет длинную операцию и изменяет видимость overlayGrid, выглядит следующим образом:
Sub Refresh()
Me.Worker.Message = String.Format("Refresh started at {0}..",
Date.Now.ToString("hh:mm:ss.fff")
)
Me.Worker.Visibility = Visibility.Visible
' Give the UI a chance to update itself.
System.Windows.Forms.Application.DoEvents()
Console.WriteLine("Debug: " + Me.Worker.Message)
' Fake the long operation.
System.Threading.Thread.Sleep(1000)
Me.Worker.Message = String.Format("Refresh completed at {0}.",
Date.Now.ToString("hh:mm:ss.fff")
)
Me.Worker.Visibility = Visibility.Collapsed
Console.WriteLine("Debug: " + Me.Worker.Message)
End Sub
Почему фактическая видимость overlayGrid задерживается, когда TextBox имеет фокус?Как мне обойти эту проблему?