Adorner 不会在 ContentPresenter 中应用来自资源的数据模板

本文关键字:资源 数据 应用 ContentPresenter Adorner | 更新日期: 2023-09-27 18:30:29

我有一个装饰器,用于在拖放时提供视觉反馈。装饰者在内部使用内容演示器来显示(非视觉)内容。当我使用视觉对象作为内容时,(视觉)对象会正确呈现,但是当我使用非视觉对象时,Adorner 及其 ContentPresenter 仅调用 ToString(),并且不应用任何给定的数据模板。

有谁知道我做错了什么,数据模板不用于渲染 Adorner 图层上的非视觉对象?

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

装饰者:

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();
        }
    }
}

装饰器中用作内容的非可视类:

    internal class Model {}

MainWindow.xaml

<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 背后的代码:

    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);
    }

似乎这个问题处理了同样的问题:点击这里

Adorner 不会在 ContentPresenter 中应用来自资源的数据模板

我找到了一个解决方案:

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