WPF编写自定义控件

WPF编写自定义控件,wpf,custom-controls,Wpf,Custom Controls,我想写一个自定义控件来显示一个族谱。。。所以我看了《家庭秀》 所以他们的控制权继承了FrameworkElement,但是每件事都变得超级复杂。。。有没有简单的教程介绍如何实现带有子元素的自定义FrameworkElement等等 基本上,我没有做到的是,添加子控件并显示它们,在绘制时获取子控件的坐标…我建议查看。通常,有一种方法可以只使用内置控件和分层数据模板,而不是生成自定义控件 鉴于您希望显示族谱,应该可以直接在标准WPF控件中执行此操作。我建议您查看。通常,有一种方法可以只使用内置控件和

我想写一个自定义控件来显示一个族谱。。。所以我看了《家庭秀》

所以他们的控制权继承了FrameworkElement,但是每件事都变得超级复杂。。。有没有简单的教程介绍如何实现带有子元素的自定义FrameworkElement等等

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

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

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

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


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

完全扩展的TreeView控件可用于显示族谱。Josh Smith有一些文章介绍了如何将其布局更改为家谱中常用的布局,您可以根据自己的需要进行调整:


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

完全展开的TreeView控件可用于显示族谱树。Josh Smith有一些文章介绍了如何将其布局更改为家谱中常用的布局,您可以根据自己的需要进行调整:


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

您要查找的是一个
面板
:它已经公开了
UIElementCollection
类型的
子属性,因此,您只需添加子项并重写两个方法:

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
完成并可以访问子对象的实际位置后调用


对于详细的教程,我会选择“WPF面板教程”或“WPF自定义面板教程”。以下是。

您正在寻找的是一个
面板
:它已经公开了
UIElementCollection
类型的
子属性,因此您只需添加子属性并覆盖两个方法:

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
完成并可以访问子对象的实际位置后调用


对于详细的教程,我会选择“WPF面板教程”或“WPF自定义面板教程”。这是。

是的,我确实研究过使用树控件,但我从未设法以任何方式获得“家长”和“孩子”之间的线条,我认为这将是学习如何编写自定义控件的一个很好的教训。是的,我研究过使用树控件,但我从未设法获得“家长”和“孩子”之间的线条无论如何,我认为这将是学习如何编写自定义控件的一个很好的课程当然,我会选择一些简单的东西,但我仍然需要有关放置子元素的信息,以获得它们的大小和位置当然,我会选择一些简单的东西,但我仍然需要关于放置子元素以获得它们的大小的信息以及随后的安抚。。