かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

自動で切り替わるFlipViewの作り方

こんなBehaviorを作ってぽとっとすればOK

public class FlipViewRollingBehavior : Behavior<FlipView>
{
    private IDisposable disposable;

    public static readonly DependencyProperty IntervalProperty =
        DependencyProperty.Register(
            "Interval", 
            typeof(int), 
            typeof(FlipViewRollingBehavior), 
            new PropertyMetadata(15));

    public int Interval
    {
        get { return (int)GetValue(IntervalProperty); }
        set { SetValue(IntervalProperty, value); }
    }

    protected override void OnAttached()
    {
        disposable = Observable.Interval(TimeSpan.FromSeconds(this.Interval))
            .Subscribe(async _ =>
            {
                await this.AssociatedObject.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    var index = this.AssociatedObject.SelectedIndex;
                    index++;
                    if (index >= ((IEnumerable<object>)this.AssociatedObject.ItemsSource).Count())
                    {
                        index = 0;
                    }

                    this.AssociatedObject.SelectedIndex = index;
                });
            });
    }

    protected override void OnDetaching()
    {
        disposable.Dispose();
        disposable = null;
    }
}

ちなみに、WinRT用のBehaviorの基本クラスはReactivePropertyにこっそり入ってるので、それを参照に追加してから作ってください。ReactivePropertyに依存したくない場合は基本クラスをDependencyObjectとIBehaviorにしてAssosiatedObjectを適当にFlipViewにキャストしてしまえばOKです。