询问时未显示图标

时间:2019-07-19 14:26:36

标签: c# wpf xaml prism

当我想导航到特定视图时,我的应用程序被阻止,因此我想显示一个加载图标。问题是该图标从未出现在预期的状态。视图发生了变化,我再也看不到该图标,但是如果我返回,该图标就在那里。

我尝试使用异步任务进行导航,但是我想导航无法在任务中工作。

有什么建议或想法吗?

XAML代码:

<UserControl xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             xmlns:fa="http://schemas.fontawesome.io/icons/">
     <Grid>
          <Listbox ItemsSource={Binding ItemsList}>

          </Listbox>
          <Canvas Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="-550, 180, 0, 0">
              <fa:ImageAwesome Visibility="{Binding LoadingIcon, UpdateSourceTrigger=PropertyChanged}" 
                               Icon="Spinner" 
                               Spin="True" 
                               Canvas.Left="56" 
                               Canvas.Top="-17" />
          </Canvas>
     </Grid>
     <UserControl.InputBindings>
    <KeyBinding Key="Enter" Command="{Binding NavigateToMainMenuCommand}"/>
</UserControl.InputBindings>
</UserControl>

ViewModel:

public class LoginViewModel: ViewModelBase, INotifyPropertyChanged, INavigationAware
{
     public InicioContableViewModel(IRegionManager regionManager,
                                   IEventAggregator eventAggregator)
    {
        _regionManager = regionManager;
        _eventAggregator = eventAggregator;
        NavigateToMainMenuCommand = new DelegateCommand(NavigateToMainMenu);

        LoadingIcon = Visibility.Hidden;
    }

    public DelegateCommand NavigateToMainMenuCommand { get; private set; }

    private Visibility loadingIcon;
    public Visibility LoadingIcon
    {
        get
        {
            return loadingIcon;
        }
        set
        {
            SetProperty(ref loadingIcon, value, nameof(LoadingIcon));
            NotifyPropertyChanged(nameof(LoadingIcon));
        }
    }

    private void NavigateToMainMenu()
    {
        LoadingIcon = Visibility.Visible;

        string mainUri = nameof(SomeRoute.MainMenu);

        _regionManager.RequestNavigate(Regions.MainRegion, mainUri);
    }
}

4 个答案:

答案 0 :(得分:0)

在“图标”的属性中,尝试将“构建操作”设置为“资源”。

答案 1 :(得分:0)

WPF使用UI线程来执行诸如处理鼠标移动,在告诉您时更改图标以及将一个视图切换为另一视图的操作。所有一个线程。

当该线程正在忙于执行某项操作时,直到完成为止,UI都不会改变。

因此,如果您告诉它使某些内容可见并进行导航,则可以很好地找到视觉上发生的所有事情。因为没有时间显示您的图标。

尝试使您的方法异步并给它一点时间:

private async void NavigateToMainMenu()
{
    LoadingIcon = Visibility.Visible;
    await Task.Delay(60);

    string mainUri = nameof(SomeRoute.MainMenu);

    _regionManager.RequestNavigate(Regions.MainRegion, mainUri);
}

该task.delay应该给它足够的时间来重绘一些ui。

如果您需要一个加载图标,并且正在浏览的东西被阻止,那么我怀疑您还有其他问题。这个新视图用来初始化的一切可能都是异步的。也许可以通过后台线程访问数据。

答案 2 :(得分:0)

您很可能会使用以下功能:-InvalidateVisual()或UpdateLayout()。这些将迫使重绘,并可能解决您的图标可见性问题。

答案 3 :(得分:0)

  

当我想导航到特定视图时,我的应用程序正在阻止,因此我想显示一个加载图标。

如果该应用被阻止,则无法显示该图标,因为您知道该应用已被阻止。您必须删除阻塞,也就是说,使导航本身快速进行,并异步执行任何初始化。您要导航到的视图可能需要数据库中的内容或与USB设备的连接,但不需要立即。显示视图后,您仍然可以查询数据库或后台的任何内容。

显示等待指示器->导航->创建视图模型->启动初始化任务->初始化完成->隐藏等待指示器