【发布时间】:2014-03-11 09:29:19
【问题描述】:
当我点击一个元素时,我试图放大画布。 这是我的 XAML 代码:
<Canvas Grid.Row="1" x:Name="MapCanvas" Width="{Binding ElementName=This, ath=ActualWidth}"
RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="{Binding ElementName=Row1, Path=ActualHeight}">
<Canvas.RenderTransform>
<CompositeTransform x:Name="CompositeTransform" CenterX="0.5" CenterY="0.5"></CompositeTransform>
</Canvas.RenderTransform>
<Rectangle Fill="Red" Width="40" Height="40" Tap="UIElement_OnTap" Canvas.Left="417" Canvas.Top="186"/>
<Rectangle Fill="Blue" Width="40" Height="40" Tap="UIElement_OnTap" Canvas.Left="333" Canvas.Top="135"/>
<Rectangle Fill="Yellow" Width="40" Height="40" Tap="UIElement_OnTap" Canvas.Left="333" Canvas.Top="223"/>
<Rectangle Fill="Green" Width="40" Height="40" Tap="UIElement_OnTap" Canvas.Left="498" Canvas.Top="135"/>
<Rectangle Fill="White" Width="40" Height="40" Tap="UIElement_OnTap" Canvas.Left="498" Canvas.Top="223"/>
</Canvas>
这是触发 Tap 方法时的我的 C# 代码:
var mpos = e.GetPosition(MapCanvas);
var parentcenter = new Point(((FrameworkElement)MapCanvas.Parent).ActualWidth / 2, ((FrameworkElement)MapCanvas.Parent).ActualHeight / 2);
var sb1 = new Storyboard {Duration = TimeSpan.FromMilliseconds(800)};
var scaleX = new DoubleAnimation { Duration = TimeSpan.FromMilliseconds(800), To = parentcenter.X - mpos.X };
Storyboard.SetTarget(scaleX, MapCanvas);
Storyboard.SetTargetProperty(scaleX, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.ScaleX)"));
sb1.Children.Add(scaleX);
var scaleY = new DoubleAnimation { Duration = TimeSpan.FromMilliseconds(800), To = parentcenter.Y - mpos.Y };
Storyboard.SetTarget(scaleY, MapCanvas);
Storyboard.SetTargetProperty(scaleY, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.ScaleY)"));
sb1.Children.Add(scaleY);
var centerX = new DoubleAnimation { Duration = TimeSpan.FromMilliseconds(800), To = 5 };
Storyboard.SetTarget(centerX, MapCanvas);
Storyboard.SetTargetProperty(centerX, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateX)"));
sb1.Children.Add(centerX);
var centerY = new DoubleAnimation { Duration = TimeSpan.FromMilliseconds(800), To = 5 };
Storyboard.SetTarget(centerY, MapCanvas);
Storyboard.SetTargetProperty(centerY, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)"));
sb1.Children.Add(centerY);
sb1.Begin();
这只是一个使用缩放和平移转换的故事板。 但结果并不令人满意。单击的元素不是中心。
我该怎么做? 谢谢!
【问题讨论】:
-
您的
scaleX和scaleY动画正在应用于TranslateX和TranslateY属性。 -
嗯,对不起,这只是一个错误。我编辑我的代码
-
您能否更具体地说明您希望如何缩放?您是否还希望能够平移或放大点击的元素?你想在每次点击时只放大一点,放大到不涉及剪裁的最大比例还是放大到填充?
-
请注意,此绑定不起作用:
Width="{Binding ElementName=This, Path=ActualWidth}"。 IIRC -ActualWidth/Height不能用作绑定源,除非最近发生了变化。
标签: c# canvas windows-runtime click zooming