확인 뷰 모델을 업데이트 뭔가 OnLoaded 또는 OnResizeChanged을 실행 해보십시오 정말 오래된 질문,하지만 난이 문제를 해결 한 이후이, 후손을 위해 공유하고자합니다 나 자신. 내가 찾은 최선의 해결책은 ScrollView 클래스에서 파생되고 원하는 속성을 구현하는 사용자 정의 컨트롤을 만드는 것입니다. 물론이 클래스는 기본 클래스의 바인딩 할 수없는 속성에 연결됩니다.
OnPropertyChanged 함수를 사용하여 속성을 모니터링하고 값을 동기화 상태로 유지할 수 있습니다.
다음은 DynamicScrollViewer라는 사용자 정의 사용자 정의 컨트롤의 전체 코드 숨김입니다. DynamicHorizontalOffset, DynamicVerticalOffset, DynamicViewportWidth 및 DynamicViewportHeight라는 4 개의 바인드 가능한 종속성 속성이 있습니다.
두 가지 오프셋 속성을 사용하면 오프셋의 읽기 및 쓰기 제어가 가능하며 뷰포트 속성은 기본적으로 읽기 전용입니다.
다양한 구성 요소 (왼쪽 레이블, 중간 노드, 맨 위에 타임 라인)가 동 기적으로 스크롤해야하지만 제한된 측면에서만 필요했던 복잡한 애니메이션 편집기 컨트롤을 만들 때이 클래스를 사용해야했습니다. 공통의 외부 스크롤 바운드 스프레드 시트에서 행 섹션 잠금을 생각하면 아이디어를 얻을 수 있습니다.
using System.Windows;
using System.Windows.Controls;
namespace CustomControls
{
public partial class DynamicScrollViewer : ScrollViewer
{
public DynamicScrollViewer()
{
InitializeComponent();
}
public double DynamicHorizontalOffset
{
get { return (double)GetValue(DynamicHorizontalOffsetProperty); }
set { SetValue(DynamicHorizontalOffsetProperty, value); }
}
public static readonly DependencyProperty DynamicHorizontalOffsetProperty =
DependencyProperty.Register("DynamicHorizontalOffset", typeof(double), typeof(DynamicScrollViewer));
public double DynamicVerticalOffset
{
get { return (double)GetValue(DynamicVerticalOffsetProperty); }
set { SetValue(DynamicVerticalOffsetProperty, value); }
}
public static readonly DependencyProperty DynamicVerticalOffsetProperty =
DependencyProperty.Register("DynamicVerticalOffset", typeof(double), typeof(DynamicScrollViewer));
public double DynamicViewportWidth
{
get { return (double)GetValue(DynamicViewportWidthProperty); }
set { SetValue(DynamicViewportWidthProperty, value); }
}
public static readonly DependencyProperty DynamicViewportWidthProperty =
DependencyProperty.Register("DynamicViewportWidth", typeof(double), typeof(DynamicScrollViewer));
public double DynamicViewportHeight
{
get { return (double)GetValue(DynamicViewportHeightProperty); }
set { SetValue(DynamicViewportHeightProperty, value); }
}
public static readonly DependencyProperty DynamicViewportHeightProperty =
DependencyProperty.Register("DynamicViewportHeight", typeof(double), typeof(DynamicScrollViewer));
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property == DynamicVerticalOffsetProperty)
{
if (ScrollInfo != null)
ScrollInfo.SetVerticalOffset(DynamicVerticalOffset);
}
else if (e.Property == DynamicHorizontalOffsetProperty)
{
if (ScrollInfo != null)
ScrollInfo.SetHorizontalOffset(DynamicHorizontalOffset);
}
else if (e.Property == HorizontalOffsetProperty)
{
DynamicHorizontalOffset = (double)e.NewValue;
}
else if (e.Property == VerticalOffsetProperty)
{
DynamicVerticalOffset = (double)e.NewValue;
}
else if (e.Property == ViewportWidthProperty)
{
DynamicViewportWidth = (double)e.NewValue;
}
else if (e.Property == ViewportHeightProperty)
{
DynamicViewportHeight = (double)e.NewValue;
}
}
}
}