Wpf 如何在XAML中获取控件的位置?
我想得到一个控件相对于其父控件的位置,或者任何一种位置,都不重要。但我只想在XAML中这样做,不需要任何代码。我有一个网格5x3,按钮位于第三行和第二列。所以,基本上我想得到网格前两行的宽度,以及网格第一列的宽度 我想知道按钮的位置(以像素为单位),因为我想做如下的平移动画:Wpf 如何在XAML中获取控件的位置?,wpf,xaml,Wpf,Xaml,我想得到一个控件相对于其父控件的位置,或者任何一种位置,都不重要。但我只想在XAML中这样做,不需要任何代码。我有一个网格5x3,按钮位于第三行和第二列。所以,基本上我想得到网格前两行的宽度,以及网格第一列的宽度 我想知道按钮的位置(以像素为单位),因为我想做如下的平移动画: <DoubleAnimation Storyboard.TargetName="Studio" Storyboard.TargetProperty="RenderTransform.(TranslateTransfo
<DoubleAnimation Storyboard.TargetName="Studio" Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)" From="500" To="0" Duration="0:0:2">
但是,我不希望使用硬编码值500,而是希望它是与按钮的水平位置(以像素为单位)相对应的任何内容,类似下面的XAML可能适合您。它的灵感来自于您的想法,即填充按钮左侧列的透明虚拟矩形
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Rectangle x:Name="dummy" Grid.ColumnSpan="2"/>
<Button Grid.Column="2" VerticalAlignment="Center" Content="Click">
<Button.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="-1"/>
<TranslateTransform/>
<ScaleTransform ScaleX="-1"/>
</TransformGroup>
</Button.RenderTransform>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[1].X"
To="{Binding ActualWidth, ElementName=dummy}"
Duration="0:0:2"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</Grid>
与如上所示声明RenderTransform不同,您可能最好使用绑定转换器来反转虚拟矩形的
ActualWidth
属性的值。我使用MVVM,并且倾向于不在后面编写任何代码。我知道MVVM并不是要完全消除代码落后,但到目前为止,在我的应用程序中,我不需要编写任何代码落后,我希望保持这种方式。请说明问题的原因。这将有助于您快速获得答案,因为From和to属性需要编译时常量,这是XAML无法做到的。启动应用程序时,脚本将冻结,因为动画需要线程安全,而动态属性不允许这样做。我遇到了一个类似的问题,必须在ViewModel中执行。请看:@Nikola.Lukovic“From和to属性需要编译时常量”这不是真的,因为它们是依赖性属性,可以从绑定(或其他源)获取它们的值。我可以想象一个带有绑定和适当绑定转换器的解决方案可能适合这里。@Clemens如果他使用的是样式或datatemplate/controltemplate,那么这些属性是不可绑定的。你能给我一些关于该转换器的提示吗?请看一下Binding.converter
属性的在线文档。您的实现只需返回-(double)值代码>从它的转换方法。