【问题标题】:WPF Writing custom ControlWPF编写自定义控件
【发布时间】:2010-04-13 18:39:33
【问题描述】:

我想写一个自定义控件来显示家谱...所以我查看了 FamilyShow....

所以他们的控件继承了 FrameworkElement,但随后每件事都变得超级复杂......有没有简单的教程展示如何实现自定义 FrameworkElement 和子元素等等?

基本上我做不到的是,添加子控件并显示它们,绘制时获取子控件的坐标...

【问题讨论】:

    标签: wpf custom-controls


    【解决方案1】:

    您要查找的是Panel:它已经公开了UIElementCollection 类型的Children 属性,因此您需要做的就是添加孩子并覆盖两个方法:

    MeasureOverride 计算所需的面板大小。您可以退回任何您喜欢的尺寸。要占用所有可用空间,只需返回约束:

    protected virtual Size MeasureOverride(Size availableSize)
    {
      return availableSize;
    }
    

    ArrangeOverride 将每个孩子的位置计算为一个 Rect。您可以轻松地使用附加属性来存储每个孩子的附加数据。这可以是公开可见的数据,例如 DockPanel.Dock 或 Canvas.Top,也可以是您用来记住所有内容和原因的私有数据。 ArrangeOverride 的骨架是:

    protected virtual Size ArrangeOverride(Size finalSize)
    {
      foreach(UIElement child in Children)
      {
        Rect childLocation = ... code to compute child location ...
        child.Arrange(childLocation);
      }
      return finalSize;
    }
    

    对于绘制线条,您可以使用子控件或简单地覆盖OnRender 并将线条直接绘制到DrawingContext 中。 OnRender 总是在 ArrangeOverride 完成并且可以访问孩子的实际位置之后调用。

    对于详细的教程,我会 Bing “WPF 面板教程”或“WPF 自定义面板教程”。这里是one that looked good

    【讨论】:

      【解决方案2】:

      我建议查看using a HierarchicalDataTemplate。通常,有一种方法可以只使用带有分层数据模板的内置控件,而不是生成自定义控件。

      鉴于您希望显示家谱,应该可以直接在标准 WPF 控件中执行此操作。

      【讨论】:

      • 是的,我确实考虑过使用树控件,但我从来没有设法在“父母”和“孩子”之间划清界限,我认为这将是学习如何写作的一个很好的教训自定义控件..
      【解决方案3】:

      完全展开的 TreeView 控件可用于显示家谱。 Josh Smith 有一些文章如何将其布局更改为家庭树常用的布局,您可以根据自己的需要进行调整:http://www.codeproject.com/KB/WPF/CustomTreeViewLayout.aspx

      如果您仍想学习如何开发自定义控件,请首先选择比家族树控件更容易的自定义控件。

      【讨论】:

      • 好吧,我肯定会选择一些简单的东西,但我仍然需要有关放置我的子元素的信息,然后获得它们的大小和位置..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多