如何绑定到 MouseDragElementBehavior 的 X 位置?
How do I bind to the X position of a MouseDragElementBehavior?
我的目标是在我拖动它时在 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: Property path is not valid. 'Interaction' does not have a public property named 'Behaviors'.
属性 之所以存在,是因为在移除 TextBlock 时拖动有效。我试过各种括号组合,我什至试过x:static。有帮助吗?
编辑
重读WPF Attached Property Data Binding,并没有解决我的问题。 Path=
在 Xaml 中并且包含括号。该错误不是绑定错误,而是 InitializeComponent 内部发生的运行时错误。
MouseDragElementBehavior
是安装到我的项目中的 Microsoft.Xaml.Behaviors.Wpf
Nuget 包的一部分。
啊,好的。在那种情况下,the code for MouseDragElementBehavior is most certainly available, and even if it wasn't you could just open up the assembly with JustDecompile 或其他东西并以这种方式浏览。
如果你检查 the documentation for MouseDragElementBehavior 你会看到这个:
XProperty Dependency property for the X position of the dragged
element, relative to the left of the root element.
所以基本上你是在尝试将一个依赖项 属性 (TextBlock.Text) 绑定到另一个 (MouseDragElementBehavior.X),但为了使其工作,它们必须是相同的视觉或逻辑树(它们不是,MouseDragElementBehavior 是一种行为)。如果其中之一是 attached property then you could bind them directly, but in your case you have to link them together with either a property in your DataContext that supports INPC, or some kind of proxy object.
但是,即使您这样做,也会 运行 遇到问题。如果您在应用程序 运行ning 时单击 "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>
我的目标是在我拖动它时在 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: Property path is not valid. 'Interaction' does not have a public property named 'Behaviors'.
属性 之所以存在,是因为在移除 TextBlock 时拖动有效。我试过各种括号组合,我什至试过x:static。有帮助吗?
编辑
重读WPF Attached Property Data Binding,并没有解决我的问题。 Path=
在 Xaml 中并且包含括号。该错误不是绑定错误,而是 InitializeComponent 内部发生的运行时错误。
MouseDragElementBehavior
是安装到我的项目中的 Microsoft.Xaml.Behaviors.Wpf
Nuget 包的一部分。
啊,好的。在那种情况下,the code for MouseDragElementBehavior is most certainly available, and even if it wasn't you could just open up the assembly with JustDecompile 或其他东西并以这种方式浏览。
如果你检查 the documentation for MouseDragElementBehavior 你会看到这个:
XProperty Dependency property for the X position of the dragged element, relative to the left of the root element.
所以基本上你是在尝试将一个依赖项 属性 (TextBlock.Text) 绑定到另一个 (MouseDragElementBehavior.X),但为了使其工作,它们必须是相同的视觉或逻辑树(它们不是,MouseDragElementBehavior 是一种行为)。如果其中之一是 attached property then you could bind them directly, but in your case you have to link them together with either a property in your DataContext that supports INPC, or some kind of proxy object.
但是,即使您这样做,也会 运行 遇到问题。如果您在应用程序 运行ning 时单击 "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>