有谁知道如何创建和维护UserControl的单个实例并在多个XAML页面上共享它?
我的方案是创建后台更新检查程序。问题是我想让我的UserControls的实例从我的后台线程(TAP模式)使用IProgress或类似的东西接收进度更新。现在我可以通过使用Observer模式或其他东西注册到后台线程来解决这个问题。但是,如果我可以创建一个UserIntrol的目标,这与iOS的工作方式类似,那就更容易了。
任何其他想法将不胜感激!
答案 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