在XAMLS之间共享UserControl的单个实例

时间:2017-07-18 11:59:12

标签: c# xaml uwp

有谁知道如何创建和维护UserControl的单个实例并在多个XAML页面上共享它?

我的方案是创建后台更新检查程序。问题是我想让我的UserControls的实例从我的后台线程(TAP模式)使用IProgress或类似的东西接收进度更新。现在我可以通过使用Observer模式或其他东西注册到后台线程来解决这个问题。但是,如果我可以创建一个UserIntrol的目标,这与iOS的工作方式类似,那就更容易了。

任何其他想法将不胜感激!

1 个答案:

答案 0 :(得分:0)

从评论中理解后,我想我有一个明确的理解,如果我的答案显示其他方式可以随意使用评论部分,我会相应地回答。正确的,

您可以创建userControl的单例静态实例,而不是创建整个userControl static。比如说你有一个名为"UserDataControl"的用户控件。在后面的代码中声明它的静态变量:

 public static UserDataControl Instance { get; set; }

它的构造函数如下所示:

public UserDataControl()
{
    this.InitializeComponent();
    Instance = this;
}

现在,因为您要使用同一个实例将userControl添加到多个页面中,所以无法通过XAML添加控件。因此,使用c#,在onLoaded函数中将userControl添加到网格或Container愿望中。例如:在主页上,您想要将控件添加到rootLayout Grid下面是onLoaded事件的代码:

 Loaded += (s, e) =>
 {
      if (UserControls.UserDataControl.Instance == null)
         UserControls.UserDataControl.Instance = new UserControls.UserDataControl();

       rootLayout.Children.Add(UserControls.UserDataControl.Instance);
 };

请注意:检查实例是否为空,因为如果您是第一次初始化它将为空。

现在,在导航时,请确保在override使用OnNavigatingFrom的所有网页上Singleton Instance Element is already the child of another Element事件,以避免protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { //remove the user control as a child as leaving it as a child will throw you an //error "No installed components were detected. Element is already the child of another element." if (rootLayout.Children.Contains(UserControls.UserDataControl.Instance)) rootLayout.Children.Remove(UserControls.UserDataControl.Instance); base.OnNavigatingFrom(e); } 例外。以下是上例中的代码:

{{1}}

就是这样。有关完整的示例代码,您可以从一个驱动器下载演示源代码。

Github LINK: SharedUserControlSample