2014-11-21 79 views
1

我有一個有很多列的網格,所以有一個大的水平滾動。另外我有服務器分頁,所以我只顯示前100行。爲了加載更多的行,我在網格中顯示一個按鈕「Load next 100 rows」。問題是,按鈕可能會變得不可見,因爲它會滾動出視圖。這不好。我想將其水平位置固定在scrollviewer視圖端口的中心。有什麼建議麼?「Pin」ScrollViewer內的按鈕

Screenshot of what needs to be done

你看,那水平滾動是相當大的,而當用戶使用它,按鈕可能變得不可見。我在網格的最後一行顯示按鈕,所以當您向下滾動時,只有在完成時纔會看到按鈕。

其實我已經實現了我想要的東西,但是很髒的伎倆。我聽ScrollViewer.ScrollChanged,並在更新按鈕的邊緣。

private void RulesXamDataGrid_OnScrollChanged(object sender, ScrollChangedEventArgs e) 
{ 
    var grid = (XamDataGrid)sender; 
    var scroll = grid.FindDescendant<ScrollViewer>(); 
    var loadMoreButton = grid.FindElement<Button>(x => x.Name == "loadMoreButton").FirstOrDefault(); 
    if (scroll != null && loadMoreButton != null) 
     loadMoreButton.Margin = 
      new Thickness(scroll.HorizontalOffset + (scroll.ViewportWidth - loadMoreButton.ActualWidth)/2, loadMoreButton.Margin.Top, loadMoreButton.Margin.Right, loadMoreButton.Margin.Bottom); 
} 

我不喜歡這個實現,所以如果你有更好的(MVVM方式),它會很棒。

+0

你能告訴我們現在的樣子嗎?當你說你想在視口中心的按鈕,你的意思是你希望它覆蓋在行的頂部?這似乎是一個奇怪的地方,把它。 – 2014-11-21 15:17:55

回答

1

如果當你說格你的意思是DataGrid的,那麼你應該能夠與附加屬性標記按鈕

SelectiveScrollingGrid.SelectiveScrollingOrientation="None" 

這將意味着它不會滾動,而其他一切應該

另一種選擇,如果這不起作用的是將它們都放到一個包含網格中,這樣按鈕不再位於scrollviewer內部。

<Grid> 
    <DataGrid> 

    </DataGrid> 
    <Button Content="Load More" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
</Grid>