none
请问如何实现一个Actipro的zappanel的panel? RRS feed

  • 问题

  • 有几个点不太明白。

    1,鼠标的拖拽,这个似乎不应该在panel里面实现。

    2,items的布局,当item是处于可以循环的时候,不可能每次都改变item在itemslist里面的位置吧,应该是在重画布局的时候改变item的位置。

     

    请教各位能不能给个实现流程?


    野老
    2012年1月25日 3:00

答案

  • 刚才说的鼠标处理包括override部分。

    对Panel用VSM么?

    应该是在Loaded之后,向上取Selector,

    当Selector的选中项改变的时候,将选中项移动到视图区的正中。

    可是还是没有鼠标操作。

    纠结鼠标操作的一个原因是,

    如果zappanel中内容过多,出现滚动条的时候,在视图区边缘一直按着鼠标就会不断的滚动。

    =============================

    忽然想起来,Selector里面是有鼠标事件的。

    在ListBox里面,就有一个

     

    internal void NotifyListItemMouseDragged(ListBoxItem listItem)
    

     

    ==============================

    那是不是这样的:

    Loaded之后,因为是Panel,所以拿容器检查是否Selector。

    如果不是,直接就是StackPanel。

    如果是,当SelectedItem发生变化的时候,将选中的那个Item放到视图区的中间。

    鼠标操作都在Selector里面已经实现,自己当然不用重写。

     

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

    野老


    2012年1月25日 15:17
  • OK, 关于拖拽和鼠标移动的核心是在于 IScrollInfo 接口,通过这个接口,可以让我们的ItemsControl里面的ScrollViewer去捕获鼠标的动作并且通知到Panel去做相应的动作。 不过你发现的那个Nofity方法是对的, 他是在拖拽的时候通知ListBox去改变Item的行为。

    所以,比较简单的是,通过继承StackPanel,然后再次实现以下IScrollInfo接口,在其中,Page Mouse 等一些方法中我们可以循环将Children尾/头部的元素相应的放置位置,这样形成一个头尾循环的Panel组件。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月26日 4:56
    版主

全部回复

  • 1. 鼠标拖拽应该要在具体的控件上实现,而不是布局面板上。比如你要实现ListBoxItem在ListBox里面的拖拽,你就的实现ListBox上的几个拖拽事件。

    2. 你要先实现一个按照自己规则设计的自定义Panel, 具体怎么实现custom panel看这里:http://msdn.microsoft.com/en-us/library/ms754152.aspx#Panels_custom_panel_elements

    这里还有些例子:

    然后,你如果要自定义一个ItemsControl中Item的排放顺序,你只需要把你自己的设计或者系统的Panel作为这个ItemsControl 的 ItemsPanel property 就可以了:

    比如:

    <ListBox>
      <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
       ....
      </ItemsPanelTemplate>
      </ListBox.ItemsPanel>
     </ListBox>

    至于第三方公司的zappanel,他是一个循环了布局,你需要在 MensureOverride 和 ArrangeOverride 两个方法中不停的计算Panel里面各个元素的应该放置的位置。不过我这里有个和这个很类似的一个方案,3D Panel的方案 Josh Smith Blog:http://joshsmithonwpf.wordpress.com/tag/3d/

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月25日 5:52
    版主
  • 谢谢你啦。
    野老
    2012年1月25日 6:33
  • 你是野老? 好久不见,新注册的号?


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月25日 7:27
    版主
  • 额,以前那个忘记密码了……

    又注册了一个。

    又想起来了……

    反正两个换着用。


    野老
    2012年1月25日 7:46
  • reflector看了一下zappanel的代码。

    里面没有找到鼠标相关的处理。

    但是官方给出的例子是,

    直接用zappanel作为listbox的itemspaneltemplate就可以实现拖拽滚动。

    想知道这是怎么处理的。


    野老
    2012年1月25日 13:24
  • 他的父类呢? 我这边没有这个公司库,因为版权问题,我可能无法帮着去反射他的代码。
    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月25日 14:14
    版主
  • 混淆过了的,直接看的il。

    zappanel:PanelBase,IScrollInfo

    PanelBase:Panel,ILogicParent,IVisualParent

    PanelBase的两个Parent的接口只是AddChildren,RemoveChildren。

    继承关系就是这样。

    如果有实现,应该是PanelBase里面实现了吧。

     


    野老
    2012年1月25日 14:30
  • 应该是的。
    Best day, Best life
    2012年1月25日 14:34
  • 既然是这样,那么就应该有Mouse相关的事件。

    但是我找不到和Mouse有关的处理。

    里面有很多storyboard。

    即使是用动画来处理,那么也应该有触发器。

    那么触发器到底是什么呢。


    野老
    2012年1月25日 14:48
  • 如果是这样的话 他应该是重载了一些比如OnMouse方法,而不是事件。如果是动画很多的话,那他也有可能用了Visual States Manager (VSM)。
    Best day, Best life
    2012年1月25日 14:51
  • 刚才说的鼠标处理包括override部分。

    对Panel用VSM么?

    应该是在Loaded之后,向上取Selector,

    当Selector的选中项改变的时候,将选中项移动到视图区的正中。

    可是还是没有鼠标操作。

    纠结鼠标操作的一个原因是,

    如果zappanel中内容过多,出现滚动条的时候,在视图区边缘一直按着鼠标就会不断的滚动。

    =============================

    忽然想起来,Selector里面是有鼠标事件的。

    在ListBox里面,就有一个

     

    internal void NotifyListItemMouseDragged(ListBoxItem listItem)
    

     

    ==============================

    那是不是这样的:

    Loaded之后,因为是Panel,所以拿容器检查是否Selector。

    如果不是,直接就是StackPanel。

    如果是,当SelectedItem发生变化的时候,将选中的那个Item放到视图区的中间。

    鼠标操作都在Selector里面已经实现,自己当然不用重写。

     

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

    野老


    2012年1月25日 15:17
  • 试做了一下,这样基本上没有问题。

    有更好的实现方法的同学请分享一下了。谢谢。


    野老
    2012年1月25日 17:30
  • 我今天试着做一个看看。:)


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月26日 3:43
    版主
  • OK, 关于拖拽和鼠标移动的核心是在于 IScrollInfo 接口,通过这个接口,可以让我们的ItemsControl里面的ScrollViewer去捕获鼠标的动作并且通知到Panel去做相应的动作。 不过你发现的那个Nofity方法是对的, 他是在拖拽的时候通知ListBox去改变Item的行为。

    所以,比较简单的是,通过继承StackPanel,然后再次实现以下IScrollInfo接口,在其中,Page Mouse 等一些方法中我们可以循环将Children尾/头部的元素相应的放置位置,这样形成一个头尾循环的Panel组件。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月26日 4:56
    版主
  • 周末做个来玩玩。
    野老
    2012年1月26日 12:43