我正在创建一个winRt应用程序。其中我有一个Home.xaml页面,其中有一个叫做Market.xaml的页面。所以对于捕捉模式,重复相同的代码。如何避免构造函数在页面定义两次时调用两次
现在我itemListView(用于抢购)和itemGridView(全视图)都有此页面(市场)
<views:Market x:Name="viewMarket"/>
而这个页面的构造函数调用了两次,我不愿意。
所以我使用一些标志类的东西或一些更好的方法在那里。
感谢
我正在创建一个winRt应用程序。其中我有一个Home.xaml页面,其中有一个叫做Market.xaml的页面。所以对于捕捉模式,重复相同的代码。如何避免构造函数在页面定义两次时调用两次
现在我itemListView(用于抢购)和itemGridView(全视图)都有此页面(市场)
<views:Market x:Name="viewMarket"/>
而这个页面的构造函数调用了两次,我不愿意。
所以我使用一些标志类的东西或一些更好的方法在那里。
感谢
那么,让我们来谈谈这个:
XAML基本上是一个变化的语法为C#。所以,当XAML引用像您的意见的控件:市场与<Views:Market />
,你实际上在这两个地方像new Views.Market()
东西。基本上,两次调用该类。如果构造函数不会两次启动,则时间 - 空间连续体将分裂成一半。狗和猫住在一起,整个9码。
但是,这里更基础的是,C#中的构造函数或XAML类的目的是什么?是做昂贵的事情,你不想重复?不。原因是因为在UI线程被释放并允许呈现控件之前,构造函数的完成是必需的。由此产生的效果是UI挂起。
此外,C#构造函数是一种同步方法。它不能正确地调用或保持异步操作。这意味着应该立即调用长时间运行或昂贵的任务,不应该在构造函数中调用,因为它也会要求它们同步和UI阻塞。正是由于这两点,我怀疑你的构造函数被滥用了。
该解决方案位于XAML框架中。 XAML页面管道包含构造函数(因为它是一个C#类,它们都拥有它),但它也包含一个Loaded事件。在许多情况下,填充页面控件所需的努力工作在Loaded处理程序中。这允许页面正确呈现,然后启动将最终并异步更新控件内容的长时间运行操作。
在WinRT中,页面管道还在基础中包含一个OnNavigatedTo()虚拟方法,您可以将其重写为相同的效果。在覆盖中,您可以包括与服务交谈,从文件中反序列化或者使界面工作所需的任何工作等艰苦的工作。 Loaded事件和重写都可以是异步的,并且都不会阻止通过冻结构造函数来进行呈现。
但是,有一件事要考虑,因为我们是在C#和相当常见的模式称为单,允许我们在两个不同的上下文,但没有创建一个全新的类引用类型。这是通过将类构造函数设为私有的,但暴露了一个通常称为实例的公共属性,它在某个静态位置返回一个单独的共享实例。
这可能已经解决了您的问题。然后,再次,这可能不是你需要的。假设你已经知道所有这些,快速的答案是你不能阻止构造函数,因为构造函数对于创建任何类的新实例化都是必要的,包括XAML视图。相反,无论你试图阻止双重身份,都可能需要结合上述讨论。卸载的方法和静态引用以防止重复工作。
事情是这样的:
public class Market : UserControl
{
public Market()
{
Loaded += Market_Loaded;
}
static bool AlreadyLoaded = false;
void Market_Loaded(object sender, RoutedEventArgs e)
{
if (AlreadyLoaded)
return;
AlreadyLoaded = true;
// TODO: your work
}
}
但是因为静态变量的作用域太大,可能无法为你做它。相反,您可以控制是否使用添加到控件的依赖属性执行大操作。将布尔依赖属性设置为false时,第二个控件知道不要执行某些操作。当它设置为true时,第一个知道继续。等等。这可以防止未来所有视图或用户控件在应用程序中的使用,因为它们不应该运行,因为上述解决方案中的静态属性。再一次,这可能是完美的。
祝你好运!