当我想导航到特定视图时,我的应用程序被阻止,因此我想显示一个加载图标。问题是该图标从未出现在预期的状态。视图发生了变化,我再也看不到该图标,但是如果我返回,该图标就在那里。
我尝试使用异步任务进行导航,但是我想导航无法在任务中工作。
有什么建议或想法吗?
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);
}
}
答案 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设备的连接,但不需要立即。显示视图后,您仍然可以查询数据库或后台的任何内容。
显示等待指示器->导航->创建视图模型->启动初始化任务->初始化完成->隐藏等待指示器