【问题标题】:Building a logical tree for a custom control为自定义控件构建逻辑树
【发布时间】:2014-10-01 19:16:16
【问题描述】:

我正在开发一个将ObservableCollection 作为DependencyProperties 之一的控件。此属性设置为我的控件的DefaultProperty,因此我可以通过构造类似于以下内容的行将项目隐式添加到 XAML 中的集合中:

<MyControl>
    <MyItem/>
    <MyItem/>
    <MyItem/>
</MyControl>

据我了解,WPF 引擎在解析 XAML 时会构建逻辑树。因此,每个MyItem 都应该是MyControl 的逻辑子代。相反,MyControl 应该是每个MyItem 的逻辑父级。

嗯,显然还有更多。下面是我用来定义上述关系的代码。自定义控件包含ObservableCollectionDependencyProperty,并由 CLR 属性支持。

[ContentProperty("Items")]
public class MyControl : Control
{
    public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
        "Items", 
        typeof(ObservableCollection<MyItem>), 
        typeof(MyControl), 
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, OnItemsChangedProperty));

    [Category("MyControl")]
    public ObservableCollection<MyItem> Items
    {
        get { return (ObservableCollection<MyItem>)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }

    public MyControl() : base()
    {   //Set a new collection per control, but don't destroy binding.
        SetCurrentValue(ItemsProperty, new ObservableCollection<MyItem>());
    }
}

MyItem(继承FrameworkContentElement)开始,我尝试像这样访问它的逻辑父级:

if (Parent is FrameworkElement)
{    //Re-Render the parent control.
    ((FrameworkElement)Parent).InvalidateVisual();
}

令我惊讶的是,父控件永远不会重新呈现。这是因为MyItem.Parent 属性为空。这是为什么呢?

如何指示 WPF 引擎知道 MyControl 应该是 MyItem 的逻辑父级?

【问题讨论】:

  • 你确定你不是想重新发明PanelItemsControl吗?在 WPF 中通常不需要手动处理逻辑/视觉子级和重新渲染内容,因为它们都是由框架处理的。
  • 不,不是重新发明其中任何一个。我正在制作一个允许放置多组线条的图形控件。每个集合对应一个不同的项目,我的自定义控件必须在重新渲染时得到通知。我同意,这不正常;我正在创作一个非常复杂的控件。

标签: c# wpf xaml wpf-controls logical-tree


【解决方案1】:

如果这是用于具有多个图形的图表控件,那么您肯定在ItemsControl 土地上。您可能想看看您可以从 WPFToolkit 或此处列出的其他工具之一构建什么:

https://stackoverflow.com/a/4227432/1869660

至于您的实际问题,如果您确实需要手动将MyItems 添加到您的逻辑树中,您需要调用AddLogicalChild(),例如在您的OnItemsChangedProperty 事件中的某处。有一个example on MSDN

【讨论】:

  • 做到了。我不知道我需要自己处理逻辑孩子的添加/删除。非常感谢! :)
猜你喜欢
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2021-02-28
相关资源
最近更新 更多