无法访问拖动装饰器模板

Posted

技术标签:

【中文标题】无法访问拖动装饰器模板【英文标题】:Cannot access drag adorner template 【发布时间】:2011-04-05 14:40:21 【问题描述】:

我使用了 Bea Stollnitz (http://bea.stollnitz.com/blog/?p=53) 提供的示例代码,以便在我的应用程序中启用拖放,以及拖放装饰器等。

一切正常,我的拖曳装饰器显示良好,我拥有我想要的所有行为。

但是(是的,总是有但是),我无法访问 Drag Adorner 的 DataTemplate,以便根据拖动的数据显示不同的数据。

我已经简化了代码,但基础仍然存在。

这是我的 DragAdorner 的 DataTemplate

<DataTemplate x:Key="DragAndDropTemplate" DataType="x:Type MyType">
        <Grid>
            <Grid Opacity="0.5">
                <Border x:Name="HeaderBorder" CornerRadius="2" BorderThickness="1" Margin="5,2,5,2">
                   <Border x:Name="InsideBorder" CornerRadius="2" BorderThickness="1">
                      <TextBlock x:Name="number" Text="Binding Name" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
                   </Border>
                </Border>
            </Grid>
            <Border Width="17" Height="17" BorderBrush="White" HorizontalAlignment="Center" VerticalAlignment="Center" CornerRadius="1" x:Name="numberContainer" Visibility="Collapsed">
                <TextBlock x:Name="number" Text="80" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
            </Border>
        </Grid>
    </DataTemplate>

这是创建装饰器的代码:

if (this.draggedAdorner == null)
        
            var adornerLayer = AdornerLayer.GetAdornerLayer(source);
            this.draggedAdorner = new DraggedAdorner(draggedData, dataTemplate, source, adornerLayer);
        

这是初始化装饰器的代码

public DraggedAdorner(List dragDropData, DataTemplate dragDropTemplate, FrameworkElement adornedElement, AdornerLayer adornerLayer)
        : base(adornedElement)
    
        this.adornerLayer = adornerLayer;
        this.contentPresenter = new ContentPresenter();

        this.contentPresenter.Content = dragDropData[0];

        this.contentPresenter.ContentTemplate = dragDropTemplate;
        this.adornerLayer.Add(this);
    

draggedData,会是一个MyType的列表,我把第一项作为我DraggedAdorner的ContentPresenter的内容,这样DataTemplate就可以应用了。

问题是,我想访问DataTemplate的numberContainer和number控件,以便在装饰器中显示拖动对象的数量。但无论我尝试什么,我都无法访问它,它以“此操作仅对应用了此模板的元素有效”结尾。消息。

我坚信我可以做这样的事情:

this.contentPresenter.ContentTemplate.FindName("number", this.contentPresenter);

因为 DataTemplate 应该适用于 ContentPresenter,但不... 有关信息,adornedElement 是发生拖动的 ListViewItem。

如果你有任何想法......

【问题讨论】:

【参考方案1】:

好的,所以我找到了实现我想要的方法。

我不知道为什么没有早点想到它,为什么我之前没有发现任何关于这个的东西。

在尝试访问模板之前我刚刚添加了一行:

this.UpdateLayout()

看起来它强制 ContentPresenter 和 DataTemplate 对象被更新和“重新渲染”,所以 ContentPresenter 真的是由我的 DataTemplate 模板化的。

【讨论】:

以上是关于无法访问拖动装饰器模板的主要内容,如果未能解决你的问题,请参考以下文章

装饰类无法访问其属性

无法访问装饰函数内的函数属性

django自定义模板标签中的访问请求,使用标签装饰器

解析模板“登录”时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问

解析模板“~fragments/header”时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问

解析模板 [] 时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问