从评论中了解后,我想我有一个清晰的理解,如果我的答案表明,否则随意使用评论部分,我会相应地回答。获取正确的话,
您可以创建,而不是把整个userControl
static
的userControl
的单静态实例。假设你有一个名为"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);
};
请注意:检查如果实例为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
不太清楚,但我认为你可以使用像'Autofac'一个DI容器和登记'UserControl'作为单个实例 – Alex
@visc如果我得到它的权利,你有一个基本视图,您希望能够随时访问您想要的任何页面?或者说,你想拥有一个userControl,只要你想从你的代码中的任何页面或服务中获取一个userControl就可以了。或者是别的什么? –
@AdityaSharma我有页面或“视图”,在其XAML中包含一个UserControl,该页面对于该类型的所有页面都是通用的。即不是所有的页面都有这个用户控件,只是某些类型的用户控件。话虽如此,我希望该用户控件的句柄/实例在所有页面中保持不变。所以在它的UI元素上运行的线程可以引用相同的控制器。不需要观察者模式。 – visc