【问题标题】:Windows Phone 8 System Tray not appearingWindows Phone 8 系统托盘未出现
【发布时间】:2015-08-14 23:44:35
【问题描述】:

这是我在cs文件中的代码。在不同的地方获取位置时,我有完全相同的代码,它可以工作并且我能够看到进度条。为了获取位置,我在系统托盘中包装了一个异步方法,它可以工作。来到这个 Winodow 显示照片我无法在当前页面顶部看到进度指示器。这是我拥有的一段代码。在 xaml 我也有 shell:SystemTray.IsVisible="True"。请帮助为什么进度条会出现。进度条是否仅适用于异步?这不是完整的代码,而只是我有问题的部分。谢谢。

public DisplayPhotos()
{
    InitializeComponent();
    this.DataContext = this;
    SystemTray.ProgressIndicator = new ProgressIndicator();
    SystemTray.ProgressIndicator.Text = "Getting Photos";
    DisplayPhotos.SetprogressIndicator(true);
    Display(); //Not an async method.
    DisplayPhotos.SetprogressIndicator(false);  
}

private static void SetprogressIndicator(bool value)
{
    SystemTray.ProgressIndicator.IsIndeterminate = value;
    SystemTray.ProgressIndicator.IsVisible = value;
}

【问题讨论】:

    标签: c# windows-phone-7 windows-phone-8


    【解决方案1】:

    通常,您不会看到在单个非异步函数调用中进行的任何 UI 更新然后恢复。 UI 仅在每个“tick”更新一次,因此如果您在同一功能中显示和隐藏 UI,则它将永远不会显示。有关在同步处理期间 UI 如何不更新的概念的更多信息,请参阅this MSDN page(它是为 WPF 编写的,但通常适用于 XAML):

    请注意,这严格并不正确,例如独立动画发生在单独的线程上,但这是一般的经验法则。

    另外我会小心在页面的构造函数中设置ProgressIndicator,因为它在某些情况下会失败(我想如果它是在应用程序中创建的第一页)。您应该等到页面加载完成后才显示/隐藏指示器。

    【讨论】:

    • 我尝试在加载的事件中这样做,但它仍然没有出现。我是否需要为 Display 方法启动一个新线程。谢谢。
    • 您需要让操作系统在 UI 线程上做一些工作 - 在 Task 中运行您的代码会有所帮助。从构造函数移到 Loaded 事件可能会导致其他问题(我会使用 OnNavigatedTo 覆盖并确保我不会重新加载它已经加载的内容)。
    【解决方案2】:

    有时,您不会在构造函数中发现 UI 更改或一些繁重的方法调用。始终建议放置一些轻量级代码,例如:在构造函数中注册事件。

    请参考以下代码块,它可能对你有所帮助。

        public Page1() 
        {
          InitializeComponent(); 
          this.Loaded += Page1_Loaded; 
        } 
        void Page1_Loaded(object sender, RoutedEventArgs e) 
        { 
          SystemTray.IsVisible = true; 
          SystemTray.ProgressIndicator = new ProgressIndicator(); 
          SystemTray.ProgressIndicator.Islndeterminate = true; 
          SystemTray.ProgressIndicator.IsVisible = true; 
          Display(); 
          SystemTray.ProgressIndicator.IsVisible = false; 
        }
    

    在加载的事件中,你也可以使用异步函数调用。

    == 更新 ==
    让我们尝试其他方法,因为上面的代码对我有用。请也尝试使用 xaml(仅用于交叉检查)

    shell:SystemTray.BackgroundColor="Black"
    shell:SystemTray.ForegroundColor="White"
    shell:SystemTray.Opacity="1"
    shell:SystemTray.IsVisible="True">
    
    <shell:SystemTray.ProgressIndicator>
    <shell:ProgressIndicator
    Text="Waiting"
    IsIndeterminate="True"
    IsVisible="True" />
    </shell:SystemTray.ProgressIndicator>
    

    将此代码放入您的页面中只是为了正式检查它是否不是导致错误的其他任何东西。

    其次,请在代码端尝试以下代码。您应该一次实施其中任何一个。

    ProgressIndicator progress = new ProgressIndicator
    {
        IsVisible = true,
        IsIndeterminate = true,
        Text = "Downloading details..."
    };
    SystemTray.SetProgressIndicator(this, progress);
    

    只是为了清楚地理解,希望您仅构建 windows phone 8 应用程序并正确实施所有其他内容。

    仅供参考,您的“显示”方法应该需要一些时间来执行,因为如果它执行得非常快,那么 ProgressIndicator 可能不可见。

    是的,出于测试目的,您可以使用调度程序来获取单独的 UI 线程。

    【讨论】:

    • 我尝试在加载的事件中这样做,但它仍然没有出现。我是否需要为 Display 方法启动一个新线程。谢谢。
    • Nikhil,检查答案中的更新。如果可能的话,让构造函数更轻。
    猜你喜欢
    • 2023-03-19
    • 2017-08-26
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多