私のアプリでは、メインページにGridView
とListView
の1つを使用しています。前述のリストはDictionary
にあり、私はContentPresenter
の内容としてメインページにロードし、この要素はScrollViewer
にまとめられています。メインページのためGridView/ListViewビューへのスクロールが機能しない
XAML:辞書クラスの
<Pivot Grid.Row="1"
SelectionChanged="Pivot_SelectionChanged"
SelectedIndex="{Binding PivotIndex, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
<PivotItem>
<PivotItem.Header>
<TextBlock Text="Home"/>
</PivotItem.Header>
<PivotItem.Content>
<ScrollViewer ViewChanged="Scroll_ViewChanged">
<ContentPresenter ContentTemplate="{StaticResource SwitchableHomeView}"/>
</ScrollViewer>
</PivotItem.Content>
</PivotItem>
<PivotItem>
<PivotItem.Header>
<TextBlock Text="Fitness"/>
</PivotItem.Header>
<PivotItem.Content>
<ScrollViewer ViewChanged="Scroll_ViewChanged">
<ContentPresenter ContentTemplate="{StaticResource SwitchableFitnessView}"/>
</ScrollViewer>
</PivotItem.Content>
</PivotItem>
</Pivot>
およびXAML:
<DataTemplate x:Key="SwitchableHomeView"
x:DataType="data:ItemHelper">
<UserControl>
<StackPanel>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="HomeListView.Visibility"
Value="Visible"/>
<Setter Target="HomeGridView.Visibility"
Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="901"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="HomeListView.Visibility"
Value="Collapsed"/>
<Setter Target="HomeGridView.Visibility"
Value="Visible"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ListView Name="HomeListView"
Style="{StaticResource ListViewCustomStyle}"
ItemsSource="{Binding HomeList, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
ItemClick="Article_ItemClick"
Loaded="ArticleCollection_Loaded"/>
<GridView Name="HomeGridView"
Style="{StaticResource GridViewCustomStyle}"
ItemsSource="{Binding HomeList, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
ItemClick="Article_ItemClick"
Loaded="ArticleCollection_Loaded"/>
</StackPanel>
</UserControl>
</DataTemplate>
<Style x:Key="GridViewCustomStyle"
TargetType="GridView">
<Setter Property="SelectionMode"
Value="None"/>
<Setter Property="ItemsPanel"
Value="{StaticResource GridViewCenteredItemsPanel}"/>
<Setter Property="IsItemClickEnabled"
Value="True"/>
<Setter Property="ShowsScrollingPlaceholders"
Value="True"/>
<Setter Property="ItemContainerStyle"
Value="{StaticResource CustomGridViewItemStyle}"/>
<Setter Property="ItemTemplate"
Value="{StaticResource CustomGridItemTemplate}"/>
<Setter Property="ItemContainerTransitions"
Value="{StaticResource GridViewItemCustomTransitions}"/>
</Style>
<Style x:Key="ListViewCustomStyle"
TargetType="ListView">
<Setter Property="SelectionMode"
Value="None"/>
<Setter Property="IsItemClickEnabled"
Value="True"/>
<Setter Property="ShowsScrollingPlaceholders"
Value="True"/>
<Setter Property="ItemContainerStyle"
Value="{StaticResource StretchedListView}"/>
<Setter Property="ItemTemplate"
Value="{StaticResource CustomListItemTemplate}"/>
<Setter Property="ItemContainerTransitions"
Value="{StaticResource GridViewItemCustomTransitions}"/>
</Style>
辞書クラスのコードビハインド:
private async void ArticleCollection_Loaded(object sender, RoutedEventArgs e)
{
if (navigatedUri != null)
{
if (sender is GridView)
{
var gv = sender as GridView;
var item = (gv.ItemsSource as ObservableCollection<ItemHelper>)
.Where(compare => compare.ItemImage?.UriSource?.OriginalString == navigatedUri).FirstOrDefault();
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() =>
{
gv.UpdateLayout();
await Task.Delay(500);
gv.ScrollIntoView(item);
//gv.UpdateLayout();
});
var animation = ConnectedAnimationService.GetForCurrentView().GetAnimation(StaticProperties.SquareAnimationKey);
if (animation != null)
{
if (gv.ContainerFromItem(item) is GridViewItem container)
{
var root = (FrameworkElement)container.ContentTemplateRoot;
var image = (Image)root.FindName("Image");
animation.TryStart(image);
}
else
{
animation.Cancel();
}
}
if (gv.Visibility == Visibility.Visible)
{
navigatedUri = null;
}
}
else if (sender is ListView)
{
var gv = sender as ListView;
var animation = ConnectedAnimationService.GetForCurrentView().GetAnimation(StaticProperties.SquareAnimationKey);
if (animation != null)
{
var item = (gv.ItemsSource as ObservableCollection<ItemHelper>)
.Where(compare => compare.ItemImage?.UriSource?.OriginalString == navigatedUri).First();
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() =>
{
gv.UpdateLayout();
await Task.Delay(500);
gv.ScrollIntoView(item);
//gv.UpdateLayout();
});
if (gv.ContainerFromItem(item) is GridViewItem container)
{
var root = (FrameworkElement)container.ContentTemplateRoot;
var image = (Image)root.FindName("image");
// Wait for image opened. In future Insider Preview releases, this won't be necessary.
image.Opacity = 0;
animation.TryStart(image);
}
else
{
animation.Cancel();
}
}
if (gv.Visibility == Visibility.Visible)
{
navigatedUri = null;
}
}
}
}
私はに従ってListView
とGridView
を切り替えます画面サイズ。アイテムを表示した後にMainPage
に戻ると、ListView
とGridView
の両方がロードされ、Loaded
イベントが発生します。 ListView
とGridView
をその項目にスクロールしますが、常に最初の項目が表示されます。私はGoogleからさまざまなソリューションを試してみましたが、誰も私のために働いていません。
だから私はそれが機能するように正しいアプローチを使用しているかどうか尋ねたいと思います。あるいは、この仕事をするためにできることは何か良いことがあります。ありがとう
はい私はテンプレートを少し微調整しました親の 'ScrollViewer'を削除しなければなりませんでした。 – Ahmar