none
Prism中PopupBehaviors的困惑 RRS feed

  • 问题

  • 参考StockTraderRI_Desktop,希望做到Popup窗体内容模块化。

    但是照搬了StockTraderRI.Infrastructure.Behaviors的相关内容后,发现还是无法实现PopupBehavior。

    PS:PopupRegion可以顺利注册,但弹出窗体内容却显示System.object。

    在StockTraderRI.Infastructure.Behaviors中的代码小弟看不太懂,不知道Bao bob是否有空写个最简单的Sample解答一下我的困惑?

    2010年12月24日 7:41

答案

  • 懵盛盛 你好,

    在WPF中,Popup是一个比较特殊的组件,特别是他的 Visual Tree 会和其他一般组件有些不同。我们知道,一般的组件都有其可视树,至少我们是可以直接访问到他的可视树的;但Popup就不同,它的可视树是独立生成的,会在运行时被维护在一个地方。当您将 Popup 的 IsOpen 属性设置为 true 时,将创建一个具有其自己的可视化树的新窗口。该新窗口将包含 Popup 的 Child 内容。新窗口的宽度和高度不能超过屏幕宽度和高度的 75%。
    Popup 控件维持一个将其 Child 内容作为逻辑子级的引用。创建新窗口后,Popup 的内容成为该窗口的一个可视化子级并保留 Popup 的逻辑子级。相反,Popup 将保持其 Child 内容的逻辑父级。
    以上引用自:http://msdn.microsoft.com/zh-cn/library/ms749018.aspx

    所以,虽然我们可以为 Popup 注册一个Ragion来显示它的内容,但实际上内容对于Popup来说,只是一个可视树在它Child属性上的逻辑引用,实际的Popup内容被创建在一个内部的Window中,而我们无法直接引用的。

    ------------------------------------------------

    我上面是对Popup组件的一些说明,不过我看了 StockTraderRI.Infastructure.Behaviors ,这里的Popup好像不是Popup组件,而是一个Window的Popup特性,这里我想你可以在 StockTraderRI.Infrastructure.Behaviors.DialogActivationBehavior 中看到具体的 RegionPopupBehaviors 的使用,它是如何通过这个 Behavior 来达到模块化一个弹出窗体的。关于 RegionPopupBehaviors 中的两个以来属性,你可以看下 Shell.xaml 中的定义:

      infBehaviors:RegionPopupBehaviors.CreatePopupRegionWithName="{x:Static inf:RegionNames.SecondaryRegion}"
      infBehaviors:RegionPopupBehaviors.ContainerWindowStyle="{StaticResource WindowRegionStyle}"
    

    这里定义和指定那两个以来属性的值,以备之后的使用。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2010年12月27日 7:07
    版主

全部回复

  • 懵盛盛 你好,

    在WPF中,Popup是一个比较特殊的组件,特别是他的 Visual Tree 会和其他一般组件有些不同。我们知道,一般的组件都有其可视树,至少我们是可以直接访问到他的可视树的;但Popup就不同,它的可视树是独立生成的,会在运行时被维护在一个地方。当您将 Popup 的 IsOpen 属性设置为 true 时,将创建一个具有其自己的可视化树的新窗口。该新窗口将包含 Popup 的 Child 内容。新窗口的宽度和高度不能超过屏幕宽度和高度的 75%。
    Popup 控件维持一个将其 Child 内容作为逻辑子级的引用。创建新窗口后,Popup 的内容成为该窗口的一个可视化子级并保留 Popup 的逻辑子级。相反,Popup 将保持其 Child 内容的逻辑父级。
    以上引用自:http://msdn.microsoft.com/zh-cn/library/ms749018.aspx

    所以,虽然我们可以为 Popup 注册一个Ragion来显示它的内容,但实际上内容对于Popup来说,只是一个可视树在它Child属性上的逻辑引用,实际的Popup内容被创建在一个内部的Window中,而我们无法直接引用的。

    ------------------------------------------------

    我上面是对Popup组件的一些说明,不过我看了 StockTraderRI.Infastructure.Behaviors ,这里的Popup好像不是Popup组件,而是一个Window的Popup特性,这里我想你可以在 StockTraderRI.Infrastructure.Behaviors.DialogActivationBehavior 中看到具体的 RegionPopupBehaviors 的使用,它是如何通过这个 Behavior 来达到模块化一个弹出窗体的。关于 RegionPopupBehaviors 中的两个以来属性,你可以看下 Shell.xaml 中的定义:

      infBehaviors:RegionPopupBehaviors.CreatePopupRegionWithName="{x:Static inf:RegionNames.SecondaryRegion}"
      infBehaviors:RegionPopupBehaviors.ContainerWindowStyle="{StaticResource WindowRegionStyle}"
    

    这里定义和指定那两个以来属性的值,以备之后的使用。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2010年12月27日 7:07
    版主
  • Bob Bao你好!
    在StockTraderRI里,PopupBehaviors提供了一个可以用于导航的Region。
    我也希望使用同样的方式进行导航,但是在开发的时候,遇到了一些困难,链接中的代码无法正常运行,但又找不到问题所在。请帮忙看看,谢谢!
    http://cid-7c49a2abb00e1af5.skydrive.live.com/redir.aspx?resid=7C49A2ABB00E1AF5!2706
    (MyVeryFristPrismProject)
    2010年12月31日 15:15
  • 你好,

    我编译测试了你的代码,首先有个异常:{"Region with the given name is already registered: PopupRegion"} 请确认是否这个名字已经被注册过?原因是你重复创建了两个Shell对象在 Bootstarpper.cs 里面,请检查...

    请注释掉 Bootstarpper.cs 里面37行代码:

     //App.Current.MainWindow = new Shell();

    这个时候MainWindow已经是Shell了。

    致,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月3日 16:37
    版主
  • 盛盛 你好!

    最近我在学习Prism wpf框架 遇到了一些困惑。

    我也是希望套用他的导航方式,但是在新项目中无法加载导航栏出来,能否把你这个Demo程序发我研究一下

    麻烦发质 Email:yuansking@hotmail.com 谢谢!

    2012年9月28日 7:52
  • 盛盛 你好!

    最近我在学习Prism wpf框架 遇到了一些困惑。

    我也是希望套用他的导航方式,但是在新项目中无法加载导航栏出来,能否把你这个Demo程序发我研究一下

    麻烦发质 Email:yuansking@hotmail.com 谢谢!

    你有什么困惑?

    我现在也没有用Prsim自身的导航功能,而是自己做了个类似的。

    主要作用还是替换Region内容。


    2012年9月29日 1:28
  • 导航哪个搞定了,我也打算换成menu的方式导航,我现在在研究怎么使用DialogActivationBehavior弹出一个新窗体。

    你有弹出新窗口的代码吗?

    2012年10月11日 2:37