【问题标题】:WPF Telerik UI BusyIndicator not showing (UI Thread) using MVVMWPF Telerik UI BusyIndi​​cator 未使用 MVVM 显示(UI 线程)
【发布时间】:2018-07-03 04:02:47
【问题描述】:

我正在努力使以下解决方案发挥作用:

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 - 主视图

<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}"/>

目前,当我启动我的应用程序时,它会在 MainView 中加载一个名为 Main 的嵌套元素,即 Frame。此框架用于显示应用程序不同页面的内容。当我尝试导航到一个名为 Manager Console 的屏幕时,它不会显示忙碌指示符,只会暂停 UI,直到加载 ma​​nagerconsole 内容。我知道他与 UI 线程有关。我曾尝试为 ShowLoader(); 使用后台工作人员,但似乎找不到正确的方法来应用后台工作人员以使其工作。

任何帮助将不胜感激!

【问题讨论】:

  • 您能说明您的属性是如何定义的以及您是如何实现 MainViewModel 的吗?
  • 您在 _Show_Loader 中将 IsHidden 设置为 true。在不知道 Telerik Controls 的情况下,这对我来说似乎与直觉相反。我假设您必须将“IsHidden”设置为false。我假设您的 ViewModel 正确引发了 PropertyChangedEvent。
  • P.S.:你在 try/catch 中包围了布尔属性的设置。为什么?什么可能会在那里引发异常?
  • 不是throw ex; 更有意义:)
  • 只是从其他方法复制的正文内容。在这个时间点,我只想让它工作。 @Fildor 这可能是我监督的问题。

标签: c# mvvm telerik busyindicator


【解决方案1】:

您需要将 GUI 线程从 ShowLoad() 和 HideLoader() 之间的工作中解脱出来。尝试为代码的资源密集部分使用任务:

示例(未经测试):

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 中更新忙碌指示。

【讨论】:

  • 它只显示加载器并更改屏幕名称但不加载框架内容...
  • 您是否尝试调试并检查发生了什么?
  • 是的,当它到达“OpenScreen.Content = t.Result”时,它会抛出以下内容:“找不到Task.cs,您需要找到task.cs才能查看当前调用的源代码堆栈帧”。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多