我没有使用 ViewportControl 的经验,并且我假设 ViewportControl.SetViewportOrigin() 是设置原点的唯一方法(即:没有属性可以执行此操作)。
如果是这种情况,您可以将 ViewportControl 包装在自定义控件中。
添加两个控制依赖属性(ViewportX 和 ViewportY,或一个 Point 类型的依赖属性),并在故事板中为这两个属性设置动画(使用简单的 DoubleAnimation)。
在这些属性的值更改回调中,您可以使用更改后的值调用 SetViewportOrigin()。
所以像这样:
public class WrappedViewport : Control
{
private ViewportControl _viewportControl;
protected override OnApplyTemplate()
{
// make sure there is an appropriate default style in generic.xaml
_viewportControl = (ViewportControl)GetTemplateChild("Viewport");
}
#region ViewportX
private static void ViewportXChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
WrappedViewport owner = (WrappedViewport)d;
owner._viewportControl.SetViewportOrigin(ViewportX, ViewportY);
}
private static readonly DependencyProperty ViewportXProperty = DependencyProperty.Register("ViewportX",
typeof(double),
typeof(WrappedViewport),
new PropertyMetadata(0d, ViewportXChangedCallback));
public double ViewportX
{
get { return (double)GetValue(ViewportXProperty ); }
set { SetValue(ViewportXProperty , value); }
}
#endregion
#region ViewportY
private static void ViewportYChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
WrappedViewport owner = (WrappedViewport)d;
owner._viewportControl.SetViewportOrigin(ViewportX, ViewportY);
}
private static readonly DependencyProperty ViewportYProperty = DependencyProperty.Register("ViewportY",
typeof(double),
typeof(WrappedViewport),
new PropertyMetadata(0d, ViewportYChangedCallback));
public double ViewportY
{
get { return (double)GetValue(ViewportYProperty ); }
set { SetValue(ViewportYProperty , value); }
}
#endregion
}
也可以看看http://msdn.microsoft.com/en-us/library/ms752914(v=vs.110).aspx