LoadingView
Represents a control that indicates that the UI is waiting on a task to complete.
Properties
| Property | Type | Description | 
|---|---|---|
Source | 
ILoadable | 
Gets and sets the source ILoadable associated with this control. | 
LoadingContent | 
object | 
Gets or sets the content to be displayed during loading/waiting. | 
LoadingContentTemplate | 
DataTemplate | 
Gets or sets the template to be used to display the LoadingContent during loading/waiting. | 
LoadingContentTemplateSelector | 
DataTemplateSelector | 
Gets or sets the template selector to be used to display the LoadingContent during loading/waiting. | 
UseTransitions | 
bool | 
Gets and sets whether transitions will run when going between states. | 
ILoadable
Describes if this instance is currently in a busy state and notifies subscribers that said state when has changed.
Members
| Property | Type | Description | 
|---|---|---|
IsExecuting | 
bool | 
Indicates whether the instance is doing work. | 
IsExecutingChanged | 
EventHandler? | 
Event that fires when the IsExecuting state has changed. | 
LoadableSource
Represents an ILoadable that forwards the ILoadable.IsExecuting state of its Source.
CompositeLoadableSource
Represents an ILoadable aggregate that is ILoadable.IsExecuting when any of its nested Sources is.
Usage
xmlns:utu="using:Uno.Toolkit.UI"
...
<!-- single source example -->
<utu:LoadingView Source="{Binding FetchWeatherForecasts}">
    <Grid RowDefinitions="Auto,*">
        <Button Grid.Row="0" Content="Refresh" Command="{Binding FetchWeatherForecasts}">
        <ListView Grid.Row="1" ItemsSource="{Binding Forecasts}" />
    </Grid>
    <utu:LoadingView.LoadingContent>
        <StackPanel>
            <TextBlock Text="Scrying..." />
            <Image Source="ms-appx:///Assets/CrystalBall.jpg" />
        </StackPanel>
    </utu:LoadingView.LoadingContent>
<utu:LoadingView>
<!-- multi-sources example -->
<utu:LoadingView>
    <utu:LoadingView.Source>
        <utu:CompositeLoadableSource>
            <utu:LoadableSource Source="{Binding LoadContent0Command}" />
            <utu:LoadableSource Source="{Binding LoadContent1Command}" />
        </utu:CompositeLoadableSource>
    </utu:LoadingView.Source>
    <StackPanel>
        <ListView ItemsSource="{Binding Content0}" />
        <ListView ItemsSource="{Binding Content1}" />
    </StackPanel>
    <utu:LoadingView.LoadingContent>
        <ProgressRing IsActive="True" />
    </utu:LoadingView.LoadingContent>
<utu:LoadingView>
private class ViewModel : ViewModelBase
{
    public string Content0 { get => GetProperty<string>(); set => SetProperty(value); }
    public IEnumerable<int> Content1 { get => GetProperty<IEnumerable<int>>(); set => SetProperty(value); }
    public AsyncCommand LoadContent0Command { get; }
    public AsyncCommand LoadContent1Command { get; }
    private readonly Random _random = new Random();
    public ViewModel()
    {
        LoadContent0Command = new AsyncCommand(LoadContent0);
        LoadContent1Command = new AsyncCommand(LoadContent1);
    }
    public Task LoadContent0() => SimulateFetchOrWork(500, () => Content0 = DateTime.Now.ToString());
    public Task LoadContent1() => SimulateFetchOrWork(2000, () => Content1 = Enumerable.Range(0, _random.Next(3, 12)));
    private async Task SimulateFetchOrWork(int delay, Action onCompleted)
    {
        await Task.Delay(delay);
        onCompleted();
    }
}
AsyncCommand implements ILoadable to notify the LoadingView of ongoing work:
public class AsyncCommand : ICommand, ILoadable
{
    public event EventHandler CanExecuteChanged;
    public event EventHandler IsExecutingChanged;
    private Func<Task> _executeAsync;
    private bool _isExecuting;
    public AsyncCommand(Func<Task> executeAsync)
    {
        _executeAsync = executeAsync;
    }
    public bool CanExecute(object parameter) => !IsExecuting;
    public bool IsExecuting
    {
        get => _isExecuting;
        set
        {
            if (_isExecuting != value)
            {
                _isExecuting = value;
                IsExecutingChanged?.Invoke(this, new());
                CanExecuteChanged?.Invoke(this, new());
            }
        }
    }
    public async void Execute(object parameter)
    {
        try
        {
            IsExecuting = true;
            await _executeAsync();
        }
        finally
        {
            IsExecuting = false;
        }
    }
}