我正在努力让以下解决方案起作用:
C# - 属性
// IsBusy
private bool _IsBusy;
public bool IsBusy
{
get
{
return _IsBusy;
}
set
{
_IsBusy = value;
OnPropertyChanged("IsBusy");
}
}
// IsHidden
private bool _IsHidden;
public bool IsHidden
{
get
{
return _IsHidden;
}
set
{
_IsHidden = value;
OnPropertyChanged("IsHidden");
}
}
C# - MainViewModel(命令操作)
private void OpenManagerConsole()
{
try
{
ShowLoader();
Frame OpenScreen = new Frame();
OpenScreen = homewindow.FindName("Main") as Frame;
OpenScreen.Content = new ManagerConsole();
OpenScreenName = "Manager Console";
HideLoader();
}
catch (Exception ex)
{
throw ex;
}
}
C# - MainViewModel(ShowLoader()方法)
private void ShowLoader()
{
try
{
IsBusy = true;
IsHidden = false;
}
catch (Exception ex)
{
throw ex;
}
}
XAML - MainView
<Grid Grid.Row="2">
<Frame x:Name="Main" NavigationUIVisibility="Hidden" Margin="0" BorderBrush="Transparent"/>
</Grid>
<telerik:RadBusyIndicator Grid.Row="0" Grid.Column="0" Grid.RowSpan="3" IsBusy="{Binding IsBusy, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
telerik:StyleManager.Theme="Windows8Touch" d:IsHidden="{Binding IsHidden, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
目前,当我启动应用程序时,它会使用名为 Main 的嵌套元素(即Frame)加载MainView。此框架用于显示应用程序的不同页面的内容。当我尝试导航到名为管理员控制台的屏幕时,它不显示忙碌指示符,只是暂停用户界面,直到加载 managerconsole内容。我知道他与UI线程有关。我曾尝试将后台工作程序用于 ShowLoader(); ,但似乎无法找到应用后台工作程序以使其正常工作的正确方法。
非常感谢任何帮助!
答案 0 :(得分:3)
BusyIndicator在WPF上实现非常麻烦,我目前遇到类似的问题(https://www.telerik.com/forums/manually-turning-on-and-off-busy-indicator),我试图像你一样修复它。问题是 - BusyIndicator必须以不同的线程运行,推荐的方法是使用BackgroundWorker
MSDN:https://msdn.microsoft.com/en-gb/library/system.componentmodel.backgroundworker(v=vs.110).aspx
你可以在stackoverflow上找到一些如何使用busyindicator实现后台工作程序的解决方案,因为它们都不适用于我。目前我跳过了实施它,因为在我的情况下它是一个额外的功能&#34;。无论如何,你必须知道的事情:
你可以在与你的窗口相同的线程上运行它,因为它在线程完成之前不会显示(这意味着构建帧/页面,渲染等)< / p>
祝你好运!
P.S。 如果您找到了解决方案,可以共享它,我将来可能会使用它:)
答案 1 :(得分:1)
您需要从ShowLoad()和HideLoader()之间的工作中解除GUI线程。尝试将任务用于代码的资源繁重部分:
示例(未经测试):
private void OpenManagerConsole()
{
try
{
ShowLoader();
Frame OpenScreen = new Frame();
OpenScreen = homewindow.FindName("Main") as Frame;
OpenScreenName = "Manager Console";
Task.Factory.StartNew(() => {
return new ManagerConsole();
}).ContinueWith(t =>
{
OpenScreen.Content = t.Result;
HideLoader();
}, TaskScheduler.FromCurrentSynchronizationContext());
}
catch (Exception ex)
{
throw ex;
}
}
此外,您不必设置
UpdateSourceTrigger=PropertyChanged
在您的xaml中,以便更新忙碌指示。