首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Adorner没有从DataTemplates内部的资源中应用ContentPresenter

Adorner没有从DataTemplates内部的资源中应用ContentPresenter
EN

Stack Overflow用户
提问于 2013-09-06 13:47:35
回答 1查看 705关注 0票数 0

我有一个Adorner,用于在拖放时提供视觉反馈。Adorner内部使用ContentPresenter显示(非可视)内容。当我使用Visual作为内容时,(可视)对象将得到正确的呈现,但当我使用非可视对象时,Adorner及其ContentPresenter只调用ToString(),而不应用给定的任何DataTemplates。

有人知道我做错了什么吗? DataTemplates不是用来在Adorner层上呈现非可视对象的吗?

下面是一个简化的示例代码:

阿德纳:

代码语言:javascript
复制
internal class ContentAdorner : System.Windows.Documents.Adorner
{
    private readonly ContentPresenter contentPresenter = new ContentPresenter();

    public ContentAdorner(UIElement adornedElement)
        : base(adornedElement)
    {
    }

    public object Content
    {
        get
        {
            return this.contentPresenter.Content;
        }

        set
        {
            this.contentPresenter.Content = value;
        }
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return 1;
        }
    }

    protected override Visual GetVisualChild(int index)
    {
        return this.contentPresenter;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        Rect rect = new Rect(finalSize);

        this.contentPresenter.Arrange(rect);

        return finalSize;
    }

    protected override Size MeasureOverride(Size constraint)
    {
        this.contentPresenter.Measure(constraint);

        return this.contentPresenter.DesiredSize;
    }

    protected override System.Collections.IEnumerator LogicalChildren
    {
        get
        {
            ArrayList list = new ArrayList()
            {
                this.contentPresenter,
            };

            return list.GetEnumerator();
        }
    }
}

在Adorner中用作内容的非可视类:

代码语言:javascript
复制
    internal class Model {}

MainWindow.xaml

代码语言:javascript
复制
<Window x:Class="Adorner.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Adorner"
    Title="MainWindow" Height="350" Width="525" AllowDrop="True">
<Window.Resources>
    <DataTemplate DataType="{x:Type local:Model}">
        <Rectangle Fill="Yellow" Width="50" Height="50"/>
    </DataTemplate>
</Window.Resources>
<Grid Name="myGrid">
    <ContentControl MouseMove="ContentControl_MouseMove"
                    DragOver="ContentControl_DragOver">
        <ContentControl.Content>
            <local:Model/> 
        </ContentControl.Content>
    </ContentControl>
</Grid>

MainWindow.xaml背后的代码:

代码语言:javascript
复制
    private void ContentControl_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            Model model = ((ContentControl)sender).Content as Model;

            DataObject dataObject = new DataObject("Model", model);

            DragDrop.DoDragDrop(sender as DependencyObject, dataObject, DragDropEffects.Move);
        }
    }

    private void ContentControl_DragOver(object sender, DragEventArgs e)
    {
        Model model = (Model)e.Data.GetData("Model");

        ContentAdorner adorner = new ContentAdorner(this.myGrid)
        {
            Content = model,
        };

        AdornerLayer layer = AdornerLayer.GetAdornerLayer(this.myGrid);

        layer.Add(adorner);
    }

这个问题似乎处理相同的问题:Click here

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-14 12:44:38

我找到了一个解决办法:

Adorner层不知道MainWindow的资源。您可以手动将特定的DataTemplates添加到Adorner的参考资料中,也可以使用Themes/Generic.xaml和AssemblyInfo.cs文件中的ThemeInfo属性来指定DataTemplates。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18659402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档