Además de las sugerencias anteriores (Trabajador de fondo, Despachador): sí, estas son las técnicas correctas para obtener lo que desea, pero permítame hablar sobre el efecto de IU que solicitó en su pregunta. Si está utilizando el patrón MVVM, puede crear una IU "Estoy ocupado" y enlazar a una propiedad IsBusy en el modelo de vista para mostrar y ocultar la IU. Por ejemplo:
public class MyViewModel : INotifyPropertyChanged
{
// Bind to this property any UI you want to
// show/hide during long running updates
public bool IsBusy
{
get { return _isBusy; }
set
{
_isBusy = true;
OnPropertyChanged("IsBusy");
}
}
private void OnPropertyChanged(string prop)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(prop));
}
}
// Note: This is intended to be called on a background thread
private void DoLongRunningOperationOnABackgroundThread()
{
try
{
IsBusy = true;
// do your work
}
finally
{
IsBusy = false;
}
}
}
Luego, en el uso de interfaz de usuario de este xaml (o similar)
<UserControl:MyControl x:Class="MyApp.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="boolToVis"/>
</UserControl.Resources>
<Grid>
<!-- your UI code goes here -->
<!-- Below this, at higher Z-Order place a control to gray out the screen when IsBusy = true -->
<Border Background="#55000000" BorderThickness="0" Visibility="{Binding IsBusy, Converter={StaticResource boolToVis}}">
<TextBlock Text="I AM BUSY!" Font-Size="32" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White"/>
</Border>
<Grid>
</UserControl>
El efecto neto será cuando se utiliza un trabajador o subprocesos de fondo para llamar a la función DoLongRunningOperation en su modelo de vista, el borde definido en Xaml se mostrará/ocultará cuando la operación comience/se detenga. No necesitará que el despachador invoque aquí, ya que WPF maneja la clasificación de subprocesos por usted.
Hay implementaciones de controles ocupados con animaciones de whirlygig, etc ... en la red también para darle vida a la interfaz de usuario.
Saludos cordiales,
Muchas gracias, esto fue extremadamente útil. –