WPF Telerik UI BusyIndi​​cator未使用MVVM显示(UI线程)

时间:2018-01-24 07:21:49

标签: c# mvvm telerik busyindicator

我正在努力让以下解决方案起作用:

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(); ,但似乎无法找到应用后台工作程序以使其正常工作的正确方法。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

BusyIndi​​cator在WPF上实现非常麻烦,我目前遇到类似的问题(https://www.telerik.com/forums/manually-turning-on-and-off-busy-indicator),我试图像你一样修复它。问题是 - BusyIndi​​cator必须以不同的线程运行,推荐的方法是使用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中,以便更新忙碌指示。