我有一个带有两个HubSections的集线器控件。当选择HubSection更改时,我想用部分特定按钮更改AppBar的内容。
侦听SectionsInViewChanged
事件是建议实现此行为的一般解决方案,但只有两个HubSections时不会触发此事件。
是否有另一个事件可用于确定当前的HubSection?
感谢。
答案 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撰写文章:)