2014-05-06 70 views
0

我正在创建一个winRt应用程序。其中我有一个Home.xaml页面,其中有一个叫做Market.xaml的页面。所以对于捕捉模式,重复相同的代码。如何避免构造函数在页面定义两次时调用两次

现在我itemListView(用于抢购)和itemGridView(全视图)都有此页面(市场)

<views:Market x:Name="viewMarket"/> 

而这个页面的构造函数调用了两次,我不愿意。

所以我使用一些标志类的东西或一些更好的方法在那里。

感谢

回答

0

那么,让我们来谈谈这个:

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时,第一个知道继续。等等。这可以防止未来所有视图或用户控件在应用程序中的使用,因为它们不应该运行,因为上述解决方案中的静态属性。再一次,这可能是完美的。

祝你好运!