xaml UWP将焦点/选择设置为第一个listview项目

时间:2017-04-03 05:04:59

标签: c# xaml uwp

 <ListView x:Name="listview" ScrollViewer.HorizontalScrollBarVisibility="Visible"  ScrollViewer.ZoomMode="Enabled"
                  ItemsSource="{Binding YourCollection}" DoubleTapped="listview_DoubleTapped" Tapped="listview_Tapped"  SelectionChanged="listview_SelectionChanged"    
                  GotFocus ="StackPanel_GotFocus" IsItemClickEnabled="True" ItemClick="ListView_ItemClick" 
                  Margin="162,539,-103,11" Style="{StaticResource ListViewStyle1}" ScrollViewer.VerticalScrollBarVisibility="Disabled" Grid.RowSpan="2">

                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" Height="130" />
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>

                <ListView.ItemTemplate >
                    <DataTemplate>
                        <StackPanel Orientation="Vertical" Height="130" Width="192" >
                        <StackPanel Orientation="Horizontal">
                          <Image Source="{Binding Image}" Height="108" Width="192" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </StackPanel>
                        <StackPanel Orientation="Vertical" >
                           <TextBlock Text="{Binding Name}" TextAlignment="Center" Height="22" Width="192" Foreground="White" FontFamily="Assets/GothamLight.ttf#GothamLight"/>
                       </StackPanel>
                       </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

需要将焦点或选择设置为listview项目的第一项。列表视图包含一系列项目,其中焦点需要在开始时定位第一项,然后保留最后选择的项目。

2 个答案:

答案 0 :(得分:1)

根据您的编码风格,这里有多种选择。看起来您正在使用我们的事件处理程序中的代码并使用YourCollection属性绑定到视图模型类,因此我将为您提供这两个示例。 :)

使用代码隐藏

更新您的XAML文件以处理Loaded事件并命名您的ListView:

<Page Loaded="Page_Loaded">
    ...
    <ListView Name="MyListView" ItemsSource="{Binding YourCollection}">
    ...
    </ListView>

然后将以下代码添加到Page_Loaded处理程序:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    if (MyListView.Items.Count > 0)
        MyListView.SelectedIndex = 0;
}

使用视图模型

在视图模型中提供SelectedItem属性(无论您在何处定义YourCollection):

private YourItem_selectedItem = null;
public Dumb SelectedItem
{
    get { return _selectedItem; }
    set { SetProperty<YourItem>(ref _selectedItem, value); }
}

然后将ListView绑定到所选项目,就像使用ItemsSource一样:

<ListView Name="MyListView" ItemsSource="{Binding YourCollection}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">

最后,只需在加载收藏品后设置您的SelectedItem。

此方法还具有替换SelectionChanged和ItemClick事件的好处。您不会需要它们,因为在这些情况下,控件默认会更改SelectedItem。

答案 1 :(得分:0)

我找到了另一个解决方案,它不需要Page_Loaded处理程序,也不需要ViewModel中的属性SelectedItem。

<ListView Name="yourCollectionListView"
          ItemsSource="{Binding YourCollection}"
          SelectedItem="{Binding RelativeSource={RelativeSource Self}, Path=ItemSource[0]}"/>

当然,您应确保该列表至少包含一个项目。使用VisualState.StateTriggers,如果ListView为空,则可以隐藏它。

<VisualStateManager.VisualStateGroups>
  <VisualStateGroup>
    <VisualState.StateTriggers>
      <StateTrigger IsActive="{Binding YourCollection.Count, Converter={StaticResource EqualToParam}, ConverterParameter={StaticResource Zero}}"/>
    </VisualState.StateTriggers>
    <VisualState.Setters>
      <Setter Target="yourCollectionListView.Visibility" Value="Collapsed" />
    </VisualState.Setters>
  </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

在页面资源中定义零值:

<x:Int32 x:Key="Zero">0</x:Int32>

修改

甚至可以通过将以下内容绑定到SelectedItem属性来实现此目的:

SelectedItem="{Binding Path=[0]}"