2014-01-10 76 views
2

現在我有兩個滾動查看器,他們都需要始終具有相同的偏移量。同步兩個滾動查看器之間的偏移

我現在使用的(工作)解決方案是使用ScrollChanged事件。 如果ScrollChanged事件被觸發該代碼被執行:

scrollViewer.ScrollToHorizontalOffset(offset.X); 
scrollViewer.ScrollToVerticalOffset(offset.Y); 

事實是,我想盡量避免這種代碼隱藏解決方案。

我認爲這個問題最好的解決辦法是這樣的(綁定):

<ScrollViewer x:Name="scrollviewer_Top" HorizontalOffset="{Binding ElementName=scrollViewer_Center, Path=HorizontalOffset}">...</ScrollViewer> 

<ScrollViewer x:Name="scrollViewer_Left" VerticalOffset="{Binding ElementName=scrollViewer_Center, Path=VerticalOffset}" >...</ScrollViewer> 

<ScrollViewer x:Name="scrollViewer_Center" HorizontalOffset="{Binding ElementName=scrollviewer_Top, Path=HorizontalOffset}" 
            VerticalOffset="{Binding ElementName=scrollViewer_Left, Path=VerticalOffset}">...</ScrollViewer> 

現在,當我嘗試建立我得到了一些錯誤(Horizo​​ntalOffset/VerticalOffset不能設置,因爲它不有一個可訪問的集訪問者)。

任何人都知道這是否是最好的解決方案以及如何處理錯誤?或者我應該留在代碼隱藏事件?

感謝

+0

在這種情況下,使用後面的代碼可能是最簡單的解決方案,所以我會堅持下去。如果您使用MVVM,這也是可以接受的,因爲這完全是查看邏輯。 –

+0

horizo​​natloffset和verticaloffset是隻讀屬性..你cannaot設置他們的價值喜歡actualheight和實際寬度..這就是爲什麼在xaml scrollviwer沒有顯示horizo​​ntaloffset和verticaloffset.and我想你面臨的問題,因爲只有 –

+0

@阿迪萊斯特。是的,我會堅持使用代碼。似乎沒有其他解決方案。 –

回答

1

雖然沒有什麼錯,在這種情況下使用後面的代碼,它往往是習慣性地封裝事件中使用WPF與MVVM當處理到附加屬性。所以,如果你真的想想擺脫背後的代碼,你可以做到這一點。請參閱MSDN上的Attached Properties Overview頁面,以獲取附加屬性的詳細說明。

在你的情況,你可以做這樣的事情:

public static readonly DependencyProperty LinkedScrollViewerProperty = DependencyProperty.RegisterAttached("LinkedScrollViewer", typeof(ScrollViewer), typeof(ScrollViewerProperties), new UIPropertyMetadata(null, OnLinkedScrollViewerChanged)); 

public static ScrollViewer GetLinkedScrollViewer(DependencyObject dependencyObject) 
{ 
    return (ScrollViewer)dependencyObject.GetValue(LinkedScrollViewerProperty); 
} 

public static void SetLinkedScrollViewer(DependencyObject dependencyObject, ScrollViewer value) 
{ 
    dependencyObject.SetValue(LinkedScrollViewerProperty, value); 
} 

public static void OnLinkedScrollViewerChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    ScrollViewer scrollViewer = (ScrollViewer)dependencyObject; 
    ScrollViewer newLinkedScrollViewer = e.NewValue as ScrollViewer; 
    if (newLinkedScrollViewer != null) 
    { 
     newLinkedScrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset); 
     newLinkedScrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset); 
    } 
} 

如果這是在一個名爲ScrollViewerPropertiesAttached的XML命名空間前綴類,那麼你可以使用這樣的:

<ScrollViewer Name="ScrollViewerToLinkWith" ... /> 
... 
<ScrollViewer Attached:ScrollViewerProperties.LinkedScrollViewer="{Binding 
    ElementName=ScrollViewerToLinkWith}" ... /> 

現在我不能檢查此刻,所以你可能需要調整它,但它看起來是正確的。此外,你可以處理像這樣的任何UI事件。