none
论证:GridView生成数据后能否把滚动条推到指定位置 RRS feed

  • 问题

  • 我想达到的效果是:如图


    为了实现滚动条推动到指定位置,我采用的是bob方法,原地址在这里 http://social.msdn.microsoft.com/Forums/zh-CN/winstoreappzhcn/thread/fc86e310-1a79-4707-a33e-4800f9bdf623

    1,遍历gridview,找到scrollview;

    public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            string controlName = child.GetValue(Control.NameProperty) as string;
            if (controlName == name)
            {
                return child as T;
            }
            else
            {
                T result = FindVisualChildByName<T>(child, name);
                if (result != null)
                    return result;
            }
        }
        return null;
    }

    2,保存视图的水平位置:






    2012年11月30日 10:02

答案

全部回复

  • 3,当从其他页面跳转回来时,GridView加载完数据 把滚动条推到指定位置


    但是这样没有效果,滚动条不动,求大神指点原因是什么!

    我是把这段话放在GridView数据加载完成之后,按理说没什么不对,但就是没有效果。


    2012年11月30日 10:04
  • C++不知道,但是C#是直接对Gridview进行操作的 也就是你这里的FindScrollbar 是什么?

    Welcome to my sina Weibo:http://t.sina.com.cn/1791733541

    2012年12月1日 6:59
  • FindScrollbar 的作用是找到Gridview 的 scrollviewer ,和C#一样的,只是实现语法不同。

    因为GridView的滚动条不没有暴露出来的,你要遍历才能找到。


    2012年12月2日 7:43
  • xue 上班了木有。
    2012年12月3日 2:22
  • 我用BOB的方法,查找到GridView 的 scrollVier 后,

    也找到了GridView的 scrollBar;

    FincScrollBar csb;

    ScrollBar^ scrollBar;
    scrollViewBar =csb.FindVisualChildByName(sView,"HorizontalScrollBar",scrollBar);



    2012年12月3日 3:24
  • xue,快来呀。
    2012年12月3日 6:51
  • xue 去哪里鸟 @@
    2012年12月3日 9:40
  • ScrollToHorizontalOffset(d)

    这里的d你是怎样计算的?

    滚动的时候注意ScrollViewer可滚动的范围,否则不会滚动

    2012年12月4日 4:30
  • 取的值是 svastate 里保存的值;

    当时滚动条在什么位置,保存下来,

    再恢复。

    2012年12月5日 7:17
  • Hi,

    抱歉。

    你在哪里调用的ScrollToHorizontalOffset这个方法?这个方法必须要等可视树构建完毕才能调用,否则是没有效果的。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月5日 9:33
    版主
  • 我在PageLoadedHandler 中调用的

     <common:LayoutAwarePage
        x:Name="pageRoot"
        x:Class="Test.ItemsPage"
        DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
        IsTabStop="false"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Test"
        xmlns:common="using:Test.Common"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Loaded="PageLoadedHandler"> //页面加载的时候

    ==========================

    void ItemsPage::GetData()

    {

    dataBox->ite->Append(homeData);

            this->DataContext = dataBox;

    }

    void ItemsPage::PageLoadedHandler(Platform::Object^ sender,Windows::UI::Xaml::RoutedEventArgs^ e)

    {

    GetData(); //数据加载完成

           s->ScrollToHorizontalOffset(d); //推动滚动条;

    }


    2012年12月5日 9:46
  • 我在PageLoadedHandler 中调用的

     <common:LayoutAwarePage
        x:Name="pageRoot"
        x:Class="Test.ItemsPage"
        DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
        IsTabStop="false"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Test"
        xmlns:common="using:Test.Common"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Loaded="PageLoadedHandler"> //页面加载的时候

    ==========================

    void ItemsPage::GetData()

    {

    dataBox->ite->Append(homeData);

            this->DataContext = dataBox;

    }

    void ItemsPage::PageLoadedHandler(Platform::Object^ sender,Windows::UI::Xaml::RoutedEventArgs^ e)

    {

    GetData(); //数据加载完成

           s->ScrollToHorizontalOffset(d); //推动滚动条;

    }


    我看出来了,你这里load事件,只是控件的load并没有是数据load完成,你可以在getdata里面定义一个事件加载完数据产生这个事件,然后页面上响应这个事件时候移动滚动条,现在你这种做法如果数据很少的时候也许能移动,有兴趣你可以试试减少加载的数据的量 试试看

    Welcome to my sina Weibo:http://t.sina.com.cn/1791733541

    2012年12月5日 13:32
  • 我的PageLoadedHandler里面 调用的 getdata();

    getdata执行完的时候,数据当然也加载完成啦!

    2012年12月6日 3:03
  • Hi,

    我认为你的代码是没有问题的,我并没有找到有什么问题可能还需要其他的代码比如getdata()里面的代码,如果你觉得贴在论坛上会有隐私问题的话你可以把有问题的工程删掉一些设计隐私的数据之后用邮件发给我 v-axue at microsoft.com

    下面是我用来测试的代码,我并没有发现问题,我在上面绑定了一个Textblock来查看HorizontalOffset的值。

    XAML:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Grid.RowDefinitions>
                <RowDefinition Height="100" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <TextBlock Name="tb" />
            <GridView Grid.Row="1" Name="gv">
                <GridView.ItemContainerStyle>
                    <Style TargetType="GridViewItem">
                        <Setter Property="Height" Value="400" />
                        <Setter Property="Width" Value="400" />
                    </Style>
                </GridView.ItemContainerStyle>
           
                <GridView.Items>
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                    <TextBlock Text="111111" />
                </GridView.Items>
            </GridView>
        </Grid>

    C#:

      public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    string controlName = child.GetValue(Control.NameProperty) as string;
                    if (controlName == name)
                    {
                        return child as T;
                    }
                    else
                    {
                        T result = FindVisualChildByName<T>(child, name);
                        if (result != null)
                            return result;
                    }
                }
                return null;
            }
    
            private void Page_Loaded_1(object sender, RoutedEventArgs e)
            {
                ScrollViewer sv = FindVisualChildByName<ScrollViewer>(this.gv, "ScrollViewer");
                this.tb.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("HorizontalOffset"), Source = sv });
    
                sv.ScrollToHorizontalOffset(3);
            }


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月6日 7:00
    版主
  • 你的C#代码可以把滚动条推到指定位置吗?
    2012年12月6日 7:10
  • Hi,

    可以的。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月6日 7:21
    版主
  • 我写个了demo,你能帮我看看问题在哪吗?

    戳这里下载:

    在 

    void ItemsPage::PageLoadedHandler(Platform::Object^ sender,Windows::UI::Xaml::RoutedEventArgs^ e)

    函数注明了。谢谢。

    2012年12月6日 8:04
  • Hi,

    能用zip压缩吗?我这里没办法解压这个。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月6日 8:09
    版主
  • 已经改成ZIP压缩,xue你更新吧。
    2012年12月6日 8:19
  • Hi,

    我已经接到,谢谢。说实话现在还没找到问题。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月6日 10:18
    版主
  • xue,我的问题搞定了么??
    2012年12月7日 7:02
  • Hi,

    我和我的同事看过之后也没有找到问题,有可能是信息没有加载完毕的问题,你试试将那个改成异步的做法,c++的不是很熟悉,就是Task,之后用await,让它等待加载的完成。我们认为代码是没有问题的,有可能是这个导致的。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月7日 7:25
    版主
  • 其实不用那么麻烦的,在该页面加这句           

    this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;

    2012年12月10日 5:51
  • 你好,我直接用VisualTreeHelper::GetChildrenCount(itemGridView);itemGridView是要找的GridView x:Name的值,但是此时这个值为0,为什么?
    VisualTreeHelper::GetChildrenCount(itemGridView);
    	OUTPUT("VisualTreeHelper::GetChildrenCount(itemGridView) = %d",VisualTreeHelper::GetChildrenCount(itemGridView));	
    输出:

    VisualTreeHelper::GetChildrenCount(itemGridView) = 0;

    请帮忙解答

    2012年12月11日 12:09
  • 你好,我直接用VisualTreeHelper::GetChildrenCount(itemGridView);itemGridView是要找的GridView x:Name的值,但是此时这个值为0,为什么?
    VisualTreeHelper::GetChildrenCount(itemGridView);
    	OUTPUT("VisualTreeHelper::GetChildrenCount(itemGridView) = %d",VisualTreeHelper::GetChildrenCount(itemGridView));	
    输出:

    VisualTreeHelper::GetChildrenCount(itemGridView) = 0;

    请帮忙解答

    2012年12月11日 12:10
  • 你的控件隐藏了。
    2012年12月12日 3:55
  • 没有隐藏,我GridView x:Name ="itemGridView"我要找里面这个 TextBlock x:Name="CostTxt"
     <Grid x:Name="HallPageRaceListGrid"  Grid.Column="1" Grid.Row="1" >
                <GridView x:Name ="itemGridView" Grid.Column="1" Grid.Row="1" IsSwipeEnabled="false" IsItemClickEnabled="True" HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding}" ItemContainerStyle="{StaticResource StoreFrontTileStyle_Hall}" ItemsPanel="{StaticResource StoreFrontGridItemsPanelTemplate_Hall}" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionMode="None">
                   <GridView.ItemTemplate>                       
                        <DataTemplate>                       
                            <Grid HorizontalAlignment="Left" Width="613" Height="200">
                                <Grid.Background>
                                    <ImageBrush ImageSource="Assets/btn_frame.png"/>
                                </Grid.Background>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="50*"/>
                                    <ColumnDefinition Width="366*"/>
                                    <ColumnDefinition Width="157*"/>
                                    <ColumnDefinition Width="40*"/>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="25*"/>
                                    <RowDefinition Height="66*"/>
                                    <RowDefinition Height="57*"/>
                                    <RowDefinition Height="57*"/>
                                    <RowDefinition Height="25*"/>
                                </Grid.RowDefinitions>
                                <Grid Grid.Column="1" Grid.Row="2" Grid.RowSpan="2">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="*"/>
                                    </Grid.RowDefinitions>
                                    <TextBlock TextWrapping="Wrap" Grid.Row="0" Foreground="Black" Style="{StaticResource TitleTextStyle}"  VerticalAlignment="Center" Text="{Binding PlayaMountText}" FontSize="{Binding Path=FontSize26,Source={StaticResource customerFontSize}}" HorizontalAlignment="Left" FontFamily="SimHei"/>
                                    <TextBlock x:Name="CostTxt" TextWrapping="Wrap" Grid.Row="1" Foreground="Black" Style="{StaticResource TitleTextStyle}"  VerticalAlignment="Center" Text="{Binding costText}" FontSize="{Binding Path=FontSize26,Source={StaticResource customerFontSize}}" HorizontalAlignment="Left" FontFamily="SimHei"/>
                                </Grid>
                                <Image Source="{Binding MatchImage}" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" Height="66" Width="415" HorizontalAlignment="Left" VerticalAlignment="Stretch" AutomationProperties.Name="{Binding _Image}"/>
                                <CXComm:ImageButton x:Name="ButtonSignup" Grid.Column="2" Grid.Row="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="SignUpClk" BorderThickness="0" IsTabStop="False">
                                    <CXComm:ImageButton.Background>
                                        <ImageBrush ImageSource="Assets/btn_signup_n.png"/>
                                    </CXComm:ImageButton.Background>
                                    <CXComm:ImageButton.PressedBackground>
                                        <ImageBrush ImageSource="Assets/btn_signup_d.png"/>
                                    </CXComm:ImageButton.PressedBackground>
                                </CXComm:ImageButton>
                                <CXComm:ImageButton x:Name="ButtonAbout" Grid.Column="2" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="RaceAwardInfoClk" BorderThickness="0" IsTabStop="False">
                                    <CXComm:ImageButton.Background>
                                        <ImageBrush ImageSource="Assets/btn_about_n.png"/>
                                    </CXComm:ImageButton.Background>
                                    <CXComm:ImageButton.PressedBackground>
                                        <ImageBrush ImageSource="Assets/btn_about_d.png"/>
                                    </CXComm:ImageButton.PressedBackground>
                                </CXComm:ImageButton>                            
                            </Grid>
                        </DataTemplate>
                    </GridView.ItemTemplate>
                </GridView>
            </Grid>

    2012年12月12日 12:07
  • xue,这个问题我解决了。

    你想知道怎么解决的么?

    嘿嘿嘿.

    2012年12月17日 6:54
  • Hi,

    很高兴听到这个消息。欢迎分享解决方法:)。


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月17日 6:58
    版主
  • 把数值转换成 16 !进 !制!


    2012年12月18日 5:19
  • ..........居然。。。。
    2012年12月25日 2:45