DataConmplate何时用于ContentControl和ItemsControl?

时间:2014-02-21 12:15:51

标签: wpf

我创建的WPF控件继承了FrameworkElement类。其中一个是这样做的:

[ContentProperty("Children")]
public class ItemsElement : FrameworkElement
{
    public ItemsElement()
    {
        Children = new UIElementCollection(this, this);
    }

    public UIElementCollection Children { get; private set; }

    protected override int VisualChildrenCount
    {
        get
        {
            if (Children != null)
            {
                return Children.Count;
            }

            return 0;
        }
    }

    protected override Visual GetVisualChild(int index)
    {
        return Children[index];
    }

    protected override IEnumerator LogicalChildren
    {
        get
        {
            if (Children != null)
            {
                return Children.GetEnumerator();
            }

            return EmptyEnumerator.Instance;
        }
    }

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

    protected override Size ArrangeOverride(Size finalSize)
    {
        return finalSize;
    }
}

我想要的代码是拥有不是2D-UI元素的元素。我重写了测量和排列方法,以便它不计算儿童的大小。这是我想要的一种行为,因为这些计算很繁重而且毫无用处。

问题是如果我将ContentControls和ItemsControls放在我的ItemsElement类的子项中(通过XAML),这些控件似乎不会使用我在参考资料中为它们定义的DataTemplate从Content / ItemsSource生成它们的Visual子项。 / p>

如果我在MeasureOverride方法的开头添加此代码,它确实有效:

foreach (UIElement child in Children)
{
    child.Measure(availableSize);
}

我无法理解为什么......

你有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

问题确实是你为什么要扩展一个你不想要的行为?这里的答案太长了,但你可以在Control Authoring Overview中完整阅读MSDN上的页面。但简而言之,我只能假设你正在扩展错误的课程。也许你甚至不需要扩展任何课程。

在WPF中,有许多替代编写新控件。通常唯一真正需要的是为一个不能通过其他方式组成的独特控件执行一些特殊的自定义绘图。如链接页面所示, WPF允许您使用其丰富的内容模型,样式,模板和触发器来自定义现有控件。接下来继续:

  

从UserControl或Control派生的控件依赖于编写现有元素。对于许多场景,这是一个可接受的解决方案,因为从FrameworkElement继承的任何对象都可以在ControlTemplate中。但是,有时控件的外观需要的不仅仅是简单元素组合的功能。对于这些场景,基于FrameworkElement的组件是正确的选择。

最后,MeasureOverrideArrangeOverride方法需要正确实现,以便FrameworkElement呈现其项目。您只需要查看MSDN即可找到此基本信息。来自FrameworkElement.MeasureOverride Method页面:

  

您的实施应执行以下操作:
  1.迭代元素的特定子集合,作为布局的一部分,在每个子元素上调用Measure。

来自FrameworkElement.ArrangeOverride Method页面:

  

父元素应该在每个子元素上调用Arrange,否则子元素将不会呈现。

请阅读链接页面以获取更多信息,将来,请查看MSDN,了解有关问题控制,方法,事件等的信息。


更新>>>

为了回应你的冒犯性评论,我可以看到你有正当理由扩展FrameworkElement课程,但这并没有改变任何内容。您您已经阅读了我向您展示的所有页面,但出于某种原因,您没有按照您拥有的内容的明确说明进行操作/ em>要正确渲染项目。

没有必要回答关于DataTemplate的问题,以及何时呈现的问题,因为它与您的问题无关。您的问题只是因为您没有按照班级中MSDN上的说明进行操作。而已。有一件事你可以检查一下是否正确。

如果在运行应用程序时看到集合中对象类型的全名,则表示您的DataTemplate未应用时出现问题。但是,如果您没有看到任何项目,那么您的渲染就会出现问题,这只是因为您没有正确实现这两种基本方法。