एक्सएएमएल

<Page
    x:Class="ScrollViewWithDifferentTypeOfContent.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:ScrollViewWithDifferentTypeOfContent"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid Height="300">
        <ScrollViewer Name="MainScrollViewer"
                      IsVerticalRailEnabled="True"
                      VerticalScrollMode="Enabled"
                    >
            <StackPanel>
                <Image Source="/Assets/icon0.png" />
                <TextBlock Name="BlockyThing">  HELLO WORLD</TextBlock>
                <ListView Name="MyListView" ItemsSource="{x:Bind obsList}" Loaded="Page_Loaded">
                    <ListView.ItemTemplate>
                        <DataTemplate x:DataType="local:Item">
                            <StackPanel>
                                <TextBlock  Text="{x:Bind Message}"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Page>

Xaml.cs . में कोड

  public static void ScrollToElement(this ScrollViewer scrollViewer, UIElement element,
        bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null)
    {
        var transform = element.TransformToVisual((UIElement)scrollViewer.Content);
        var position = transform.TransformPoint(new Point(0, 0));

        if (isVerticalScrolling)
        {
            scrollViewer.ChangeView(null, position.Y, zoomFactor, !smoothScrolling);
        }
        else
        {
            scrollViewer.ChangeView(position.X, null, zoomFactor, !smoothScrolling);
        }
    }



namespace ScrollViewWithDifferentTypeOfContent
{
   public class Item
    {
        public string ItemName;
        public string Message;
        public static int itemNo = 0; 

        public Item()
        {
            Message = (itemNo).ToString() +  "  HELLO HELLO HELLO!!";
            ItemName = "Item" + (itemNo++);
            Debug.WriteLine(ItemName);
        }
    }

    public sealed partial class MainPage : Page
    {

        public ObservableCollection<Item> obsList = new ObservableCollection<Item>();

        public MainPage()
        {
            for(int i=0; i<40; i++)
                obsList.Add(new Item());            
            this.InitializeComponent();
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            CoreDispatcher dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;

            var ignored = dispatcher.RunAsync(CoreDispatcherPriority.High, () => {
            var TEST3 = MyListView.ContainerFromIndex(4);  
            MainScrollViewer.ScrollToElement((UIElement) TEST3);
            MainScrollViewer.UpdateLayout();          
            });
        }
    }
}

नमस्ते, इस कोड में, एक स्क्रॉलव्यूअर के भीतर एक छवि, एक टेक्स्ट बॉक्स और एक सूची दृश्य है, मैं सूची दृश्य (MyListView) के भीतर किसी आइटम पर स्क्रॉल करने का प्रयास कर रहा हूं, यह कोड काम करता है, हालांकि, कभी-कभी यह आइटम पर स्क्रॉल करता है निर्दिष्ट और कभी-कभी ऐसा नहीं होता है, मैं समझता हूं कि इसे शायद थ्रेडिंग के साथ करना है, हालांकि मैं चाहता हूं कि पृष्ठ में प्रत्येक तत्व लोड होने के बाद वह ऑपरेशन हमेशा हो।

मुझे यह क्यों चाहिए:

मुझे पृष्ठ को स्क्रॉल करके नेविगेशन लागू करने की आवश्यकता है,

सूचीदृश्य से पहले पृष्ठ में कई तत्व हैं, हालांकि मुझे सूचीदृश्य तत्व के संबंध में स्क्रॉल करने की आवश्यकता होगी।

मैं कैसे सुनिश्चित कर सकता हूं कि स्क्रॉल हमेशा होता है।

0
Skynet094 9 जुलाई 2018, 14:23

1 उत्तर

सबसे बढ़िया उत्तर

स्क्रॉलव्यूअर के अंदर ListView रखने की अनुशंसा नहीं की जाती है क्योंकि यह सूची के वर्चुअलाइजेशन को तोड़ देता है (सभी 40 आइटम प्रस्तुत किए जाएंगे)।

आप HeaderTemplate का उपयोग करके समान दृश्य परिणाम प्राप्त कर सकते हैं:

<Grid Height="300">
    <ListView Name="MyListView"
              ItemsSource="{x:Bind obsList}"
              Loaded="Page_Loaded">
        <ListView.HeaderTemplate>
            <DataTemplate>
                <StackPanel>
                    <Image Source="/Assets/icon0.png" />
                    <TextBlock Name="BlockyThing">  HELLO WORLD</TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListView.HeaderTemplate>
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:Item">
                <StackPanel>
                    <TextBlock  Text="{x:Bind Message}" />
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

फिर आप अपने कोड-बैक से स्क्रॉलइन्टोव्यू विधि को कॉल कर सकते हैं, जो अधिक मजबूत हो सकता है:

MyListView.ScrollIntoView(obsList[4]);
1
David Oliver 9 जुलाई 2018, 19:06