C# XAML之间共享的UserControl的单个实例

C# XAML之间共享的UserControl的单个实例,c#,xaml,uwp,C#,Xaml,Uwp,有人知道如何创建和维护UserControl的单个实例并跨多个XAML页面共享它吗 我的方案是创建一个后台更新检查器。问题是我想让我的UserControls实例使用IProgress或类似的工具从我的后台线程(点击模式)接收进度更新。现在我可以通过使用观察者模式或其他方式注册到后台线程来解决这个问题。但如果我能创建一个与iOS类似的UserControl的共享实例,那就更容易了 任何其他想法将不胜感激 在理解了这些评论之后,我想我已经清楚地理解了,如果我的回答表明不是这样,请随意使用评论部分,

有人知道如何创建和维护UserControl的单个实例并跨多个XAML页面共享它吗

我的方案是创建一个后台更新检查器。问题是我想让我的UserControls实例使用IProgress或类似的工具从我的后台线程(点击模式)接收进度更新。现在我可以通过使用观察者模式或其他方式注册到后台线程来解决这个问题。但如果我能创建一个与iOS类似的UserControl的共享实例,那就更容易了


任何其他想法将不胜感激

在理解了这些评论之后,我想我已经清楚地理解了,如果我的回答表明不是这样,请随意使用评论部分,我会相应地回答。马上开始


您可以创建
userControl
的单例静态实例,而不是使整个
userControl
静态。例如,假设您有一个名为
“UserDataControl”
的用户控件。在代码隐藏中声明其静态变量:

 public static UserDataControl Instance { get; set; }
它的构造函数如下所示:

public UserDataControl()
{
    this.InitializeComponent();
    Instance = this;
}
现在,由于要使用同一实例将
userControl
添加到多个页面中,因此不能通过
XAML
添加控件。因此,在
onload
函数中,使用c#,将userControl添加到网格或容器中。例如:在主页面上,您希望将控件添加到
根布局
网格
下面是
已加载事件的代码:

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

       rootLayout.Children.Add(UserControls.UserDataControl.Instance);
 };
请注意:检查实例是否为null,因为如果您是第一次初始化,它将为null

现在,在导航时,请确保在使用
单例实例
以避免
元素已经是另一个元素的子元素的所有页面上,覆盖
on navigating from
事件。下面是上述示例中的代码:

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);
}

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


Github链接:

不太确定,但我认为您可以使用像
Autofac
这样的DI容器,并将
UserControl
注册为单个instance@visc如果我没弄错的话,你有一个基本视图,你想随时从哪个页面访问它?或者,您希望有一个用户控件,可以随时从代码中的任何页面或服务弹出?还是其他原因?@AdityaSharma我有一些页面或“视图”,它们在XAML中包含一个用户控件,这是所有此类页面的通用控件。i、 不是所有的页面都有这个UserControl,只是某些类型的页面。也就是说,我希望UserControl的句柄/实例在所有页面上保持不变。因此,在其UI元素上操作的线程可以引用同一个控制器。不需要观察者模式。
控件
不能有多个父级。试图将同一个实例放在多个地方是行不通的。更好的解决方案是让多个
UserControl
实例访问其视图模型的同一实例。我建议您实际初始化Singleton并在UserControl的构造函数中引用它。也可以考虑把它存储为一个平台:WeakReference。最后,正如Aditya所说的,确保空检查@visc是否已通过此答案解决问题?如果是,请您将我的答案标记为正确(或者,如果您喜欢该方法,请甚至向上投票),以便关闭此线程?