【问题标题】:How do I bind to the X position of a MouseDragElementBehavior?如何绑定到 MouseDragElementBehavior 的 X 位置?
【发布时间】:2020-02-18 19:25:23
【问题描述】:

我的目标是在我拖动控件时在TextBlock 中显示控件的 X 位置。

xmlns:mb="http://schemas.microsoft.com/xaml/behaviors"

<cc:CardControl Name="SevenOfSpades" Canvas.Left="350" Canvas.Top="124" Width="60" Height="80" Face="S7">
    <mb:Interaction.Behaviors>
        <mb:MouseDragElementBehavior ConstrainToParentBounds="True"/>
    </mb:Interaction.Behaviors>
</cc:CardControl>
<TextBlock Text="{Binding ElementName=SevenOfSpades, Path=(mb:Interaction.Behaviors)[0].X}"/>

我正在为绑定路径的语法而苦苦挣扎。在运行时我得到一个异常:

InvalidOperationException:属性路径无效。 “交互”没有名为“行为”的公共属性。

该属性存在是因为在删除 TextBlock 时拖动起作用。我尝试过各种括号组合,我什至尝试过 x:static。有什么帮助吗?

编辑

重读WPF Attached Property Data Binding,并没有解决我的问题。 Path= 在 Xaml 中并包含括号。该错误不是绑定错误,而是 InitializeComponent 内部发生的运行时错误。

MouseDragElementBehavior 是安装到我的项目中的Microsoft.Xaml.Behaviors.Wpf Nuget 包的一部分。

【问题讨论】:

  • 这能回答你的问题吗? WPF Attached Property Data Binding
  • 如果这不能回答您的问题,请发布MouseDragElementBehavior 的代码。
  • @MarkFeldman 我在提出问题之前确实阅读了该帖子,但它并没有解决我的问题。我正在使用从 Nuget 安装到我的项目中的 Microsoft.Xaml.Behaviors.Wpf 包,所以它不是我的代码。即使我通过指定Path=(mb:Interaction.Behaviors) 忽略路径中的MouseDragElementBehavior,也会出现相同的运行时错误。

标签: wpf xaml data-binding attachedbehaviors


【解决方案1】:

啊,好的。在这种情况下,the code for MouseDragElementBehavior 肯定是可用的,即使不是,您也可以使用 JustDecompile 或其他东西打开程序集并以这种方式浏览它。

如果您检查the documentation for MouseDragElementBehavior,您会看到:

XProperty 被拖动的 X 位置的依赖属性 元素,相对于根元素的左侧。

所以基本上你是在尝试将一个依赖属性 (TextBlock.Text) 绑定到另一个 (MouseDragElementBehavior.X),但为了使其工作,它们必须是同一可视树或逻辑树的一部分(它们是't,MouseDragElementBehavior 是一种行为)。如果其中一个是 attached property,那么您可以直接绑定它们,但在您的情况下,您必须将它们与支持 INPC 的 DataContext 中的属性或某种 proxy object 链接在一起。

但是,即使您这样做,也会遇到问题。如果您在应用程序运行时单击“Go to Live Visual Tree”按钮并查看 SevenOfSpades 控件的属性,您会看到:

到目前为止,一切都很好。现在稍微拖动控件并重复此过程。突然出现了一个 RenderTransform 字段:

回顾一下 MouseDragElementBehavior 的代码,果然可以发现,该行为通过更改渲染变换来进行拖动。

所以基本上你试图用 Canvas.Top/Canvas.Left 设置位置,但行为是通过应用渲染变换偏移来设置它。选一个。我个人使用 MVVM,其中所有内容都在视图模型层中实现,因此很容易将 Canvas.Top/Canvas.Left 绑定到那里的属性。如果您想继续使用 MouseDragElementBehavior,则需要将卡片的位置以及 TextBlock 文本都绑定到渲染转换:

<Canvas>

    <Rectangle Name="SevenOfSpades" Width="60" Height="80" Fill="Blue">
        <Rectangle.RenderTransform>
            <TranslateTransform X="350" Y="124" />
        </Rectangle.RenderTransform>
        <mb:Interaction.Behaviors>
            <mb:MouseDragElementBehavior ConstrainToParentBounds="True" />
        </mb:Interaction.Behaviors>
    </Rectangle>

    <TextBlock Text="{Binding ElementName=SevenOfSpades, Path=RenderTransform.Value.OffsetX}" />

</Canvas>

【讨论】:

  • 我在Interaction.cs 源代码中也注意到了一些肮脏的技巧。不仅静态的DependencyProperty BehaviorsProperty 被设为私有强制客户端使用Get 方法进行访问,而且string name 参数被错误命名"ShadowBehaviors" 导致运行时错误进入xaml。
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2022-01-17
  • 2013-05-18
  • 2020-06-30
  • 1970-01-01
相关资源
最近更新 更多