2017-07-18 69 views
0

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

我的场景是创建一个后台更新检查器。问题是我想使用IProgress或类似的东西让我的UserControls的实例从我的后台线程(TAP模式)接收进度更新。现在我可以通过使用Observer模式注册到后台线程来解决这个问题。但是,如果我可以创建一个我正在定位的UserControl的共享实例,它与iOS的工作方式类似,那将更加容易。

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

+1

不太清楚,但我认为你可以使用像'Autofac'一个DI容器和登记'UserControl'作为单个实例 – Alex

+0

@visc如果我得到它的权利,你有一个基本视图,您希望能够随时访问您想要的任何页面?或者说,你想拥有一个userControl,只要你想从你的代码中的任何页面或服务中获取一个userControl就可以了。或者是别的什么? –

+0

@AdityaSharma我有页面或“视图”,在其XAML中包含一个UserControl,该页面对于该类型的所有页面都是通用的。即不是所有的页面都有这个用户控件,只是某些类型的用户控件。话虽如此,我希望该用户控件的句柄/实例在所有页面中保持不变。所以在它的UI元素上运行的线程可以引用相同的控制器。不需要观察者模式。 – visc

回答

0

从评论中了解后,我想我有一个清晰的理解,如果我的答案表明,否则随意使用评论部分,我会相应地回答。获取正确的话,


您可以创建,而不是把整个userControlstaticuserControl的单静态实例。假设你有一个名为"UserDataControl"的用户控件。声明的一个静态变量在后面的代码:

public static UserDataControl Instance { get; set; } 

,它的构造看起来会象下面这样:

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

现在,因为您需要使用相同的实例添加userControl成多个页面,您不能通过XAML添加控件。因此,使用c#在onLoaded函数中将userControl添加到网格或Container希望。对于例如:在炫魅要控制添加到下面的rootLayoutGrid对于onLoaded事件的代码:

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

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

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

现在在导航的同时确保您override您所使用的Singleton Instance哪里,以避免Element is already the child of another Element以外的所有页面OnNavigatingFrom事件。下面是从上面的例子的代码:

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上LINK:SharedUserControlSample

+0

我建议你实际初始化Singleton并在UserControl的构造函数中引用它。还要考虑将其存储为Platform :: WeakReference。最后,如Aditya所说,确保无效检查! –

+0

@visc有问题通过这个答案解决了吗?如果是的话,请您将我的答案标记为正确的(或者甚至是赞成它,如果您喜欢这种方法),以便该线程将被关闭? –

相关问题