2014-12-10 74 views
9

docs發生:FlipView SelectionChanged事件只有當觸摸操作是完全

注意當用戶使用觸摸 互動翻閱FlipView的內容,只有當觸摸操作 完成一個SelectionChanged事件發生。這意味着當用戶快速翻閱 內容時,單個SelectionChanged事件並不總是針對每個項目生成 ,因爲操作仍在進行。

有沒有辦法配置FlipView控制器爲每個觸發點火SelectionChanged?這種行爲使得實現分頁有趣的用戶,如果翻轉速度足夠快,可以在添加更多項目之前翻轉到列表的末尾。

回答

10

該問題的一個解決方案是擴展FlipView並監視其ScrollViewer。這是我建議的一個快速樣本。似乎在水平翻轉視圖上工作(沒有處理任何其他情況,並沒有太多測試)。

public class FixedFlipView : FlipView { 
    public ScrollViewer ScrollViewer { 
     get; 
     private set; 
    } 

    protected override void OnApplyTemplate() { 
     base.OnApplyTemplate(); 

     this.ScrollViewer = (ScrollViewer)this.GetTemplateChild("ScrollingHost"); 
     this.ScrollViewer.ViewChanged += ScrollViewer_ViewChanged; 
    } 

    void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { 
     var index = (int)this.ScrollViewer.HorizontalOffset - 2; 
     if (this.SelectedIndex != index) { 
      this.SelectedIndex = index; 
     } 
    } 
} 

需要注意以下幾點:

  1. 您可能希望得到的ScrollViewer在不依賴於它的名字用不同的方式。就像在我的回答here中使用該方法一樣。雖然,我猜這也沒關係。

  2. 對此使用單獨的事件可能是一個更好的主意。在上面的代碼中,我設置了SelectedIndex屬性,該屬性引發了SelectionChanged事件,但它也很有可能做其他事情,所以在某些情況下可能會出現問題。

+0

我沒有意識到這是直截了當的。我已經測試過它,並進行了一些調整,它將起作用。謝謝。 – 2014-12-18 04:03:20

+0

很好的答案!但我認爲在自定義控件的「OnApplyTemplate」中通過名稱獲取模板子(ScrollViewer)是很常見的。 – 2014-12-22 23:08:07

+0

@DerekBeattie:你可以在這裏添加你的「調整」嗎? – 2014-12-27 12:20:31