使用两个HubSections确定Hub中选定的HubSection

时间:2015-01-18 10:46:38

标签: c# xaml windows-phone-8.1

我有一个带有两个HubSections的集线器控件。当选择HubSection更改时,我想用部分特定按钮更改AppBar的内容。

侦听SectionsInViewChanged事件是建议实现此行为的一般解决方案,但只有两个HubSections时不会触发此事件。

是否有另一个事件可用于确定当前的HubSection?

感谢。

2 个答案:

答案 0 :(得分:0)

@Depechie指出了你正确的方向..您可以使用我创建的SelectionHub control并向其添加一个事件,当所选索引发生变化时会触发该事件

public event EventHandler SelectionChanged;

private static void OnSelectedIndexChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var hub = d as SelectionHub;
    if (hub == null) return;

    // do not try to set the section when the user is swiping
    if (hub._settingIndex) return;

    // No sections?!?
    if (hub.Sections.Count == 0) return;
    hub.OnSelectionChanged();
}

private void OnSelectionChanged()
{
    var section = Sections[SelectedIndex];
    ScrollToSection(section);
    var handler = SelectionChanged;
    if(handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

您可以通过向其添加选择更改的事件参数来扩展它。然后,您可以在后面的代码中订阅该事件,并根据索引更改应用栏按钮。

答案 1 :(得分:0)

阅读@Depechie建议的Shawn's article。我尝试在我的应用程序中实现相同的解决方案,以便使用特定于部分的按钮更新AppBar的内容。

尽管我付出了努力,但我无法使其发挥作用,因此我修改了解决方案的某些部分。我使用了行为解决方案并仅更改了ScrollerOnViewChanged函数,如下所示。这可能不是最好的方法,或者可能在不同的情况下导致意外的结果,但在我的情况下,它没有问题。

    private void ScrollerOnViewChanged(object sender, ScrollViewerViewChangedEventArgs scrollViewerViewChangedEventArgs)
    {
        _settingIndex = true;
        ScrollViewer scrollViewer = sender as ScrollViewer;
        if (scrollViewer.HorizontalOffset > (scrollViewer.ViewportWidth / 2))
            SelectedIndex = 1;
        else
            SelectedIndex = 0;

        _settingIndex = false;
    }

之后我在viewmodel中添加了一个属性,以便存储选定的索引。

    private int _selectedIndex;

    public int SelectedIndex
    {
        get { return _selectedIndex; }
        set
        {
            SetProperty(ref this._selectedIndex, value);
        }
    }

我使用XAML中的行为来更新ViewModel中的SelectedIndex。

<Hub>
    <i:Interaction.Behaviors>
        <behaviors:HubSelectionBehavior SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" />
    </i:Interaction.Behaviors>

    <HubSection>...</HubSection>
    <HubSection>...</HubSection>
</Hub>

最后要做的是使用此属性设置AppBarButtons的可见性。 SectionIndexToVisibilityConverter将SelectedIndex与ConverterParameter进行比较,如果它们相等则返回Visibility.Visible

<CommandBar>
    <AppBarButton Label="Open" Icon="World" Command="{Binding OpenInBrowserCommand}" Visibility="{Binding SelectedIndex, Converter={StaticResource SectionIndexToVisibilityConverter}, ConverterParameter=0}"/>

    <AppBarButton Label="Previous" Icon="Back" Command="{Binding PreviousAnswerCommand}" Visibility="{Binding SelectedIndex, Converter={StaticResource SectionIndexToVisibilityConverter}, ConverterParameter=1}"/>
    <AppBarButton Label="Next" Icon="Forward" Command="{Binding NextAnswerCommand}" Visibility="{Binding SelectedIndex, Converter={StaticResource SectionIndexToVisibilityConverter}, ConverterParameter=1}"/>
</CommandBar>

感谢@Depechie建议文章和@Shawn撰写文章:)