Windows Phone 7 ScrollViewer.HorizontOffset не обновляется - PullRequest
3 голосов
/ 02 августа 2011

Я создал быстрый пример, который помещает изображение в ScrollViewer, запускает DispatcherTimer, а затем распечатывает ScrollViewer.HorizontOffset каждые 200 мс.Из примера я заметил странное поведение - если я возьму изображение и прокручиваю его небольшими партиями, скажем, 60 пикселей или около того, значение HorizontalOffset никогда не изменится.Есть ли причина, по которой ScrollViewer не сообщает правильно свою позицию?

РЕДАКТИРОВАТЬ: Я также пытался захватить ScrollBar (с именем «HorizontalScrollBar») в ScrollViewer и проверить его свойство Value, но я получаю те же результаты.

EDIT2: эта ошибка возникает только в сборке Mango 7712 (даже если приложение построено для 7.0).Я закрою это и надеюсь, что это исправлено в окончательной сборке.

Пример кода.На моей машине я могу перетащить изображение для больших размеров, не получая обновления.Кажется, я получаю обновление всего за 120 или около того приращений стоимости.Я хотел бы получить обновление по крайней мере каждые 10-20 пикселей.

<Grid x:Name="LayoutRoot" Background="Transparent">
        <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" x:Name="Scroll">
            <Image Source="Jellyfish.jpg" Stretch="None"/>
        </ScrollViewer>
    </Grid>

MainPage.xaml.cs:

// Constructor
        public MainPage()
        {
            InitializeComponent();

            this.Loaded += (s, e) =>
                {
                    var scrollBar = Scroll.FindVisualChild("HorizontalScrollBar") as ScrollBar;
                    scrollBar.ValueChanged += (s1, e1) => Debug.WriteLine(DateTime.Now + " " + scrollBar.Value);
                };
        }

ExtensionMethods.cs:

public static class ExtensionMethods
    {
        public static FrameworkElement FindVisualChild(this FrameworkElement root, string name)
        {
            FrameworkElement temp = root.FindName(name) as FrameworkElement;
            if (temp != null)
                return temp;

            foreach (FrameworkElement element in root.GetVisualDescendents())
            {
                temp = element.FindName(name) as FrameworkElement;
                if (temp != null)
                    return temp;
            }

            return null;
        }

        public static IEnumerable<FrameworkElement> GetVisualDescendents(this FrameworkElement root)
        {
            Queue<IEnumerable<FrameworkElement>> toDo = new Queue<IEnumerable<FrameworkElement>>();

            toDo.Enqueue(root.GetVisualChildren());
            while (toDo.Count > 0)
            {
                IEnumerable<FrameworkElement> children = toDo.Dequeue();
                foreach (FrameworkElement child in children)
                {
                    yield return child;
                    toDo.Enqueue(child.GetVisualChildren());
                }
            }
        }

        public static IEnumerable<FrameworkElement> GetVisualChildren(this FrameworkElement root)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
                yield return VisualTreeHelper.GetChild(root, i) as FrameworkElement;
        }
    }

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Редкое обновление события прокрутки является частью улучшения производительности в Mango:

http://blogs.msdn.com/b/slmperf/archive/2011/06/02/listbox-scrollviewer-performance-improvement-for-mango-and-how-it-impacts-your-existing-application.aspx

Исправление заключается в изменении ManipulationMode ScrollViewer следующим образом:

<ListBox ItemsSource="{Binding Items}" ScrollViewer.ManipulationMode ="Control" Height="652" Canvas.Top="80">
2 голосов
/ 02 августа 2011

У меня есть опыт работы с scrollviewer и horizontalOffset, вы можете обновить инструмент разработчика до beta2, чтобы он работал (в моем случае scrollviewer был известной ошибкой в ​​бета-версии).Если это все еще не повезло, попробуйте мой код (работа для меня):

    public MainPage()
    {
        InitializeComponent();
        if (someVariable == 0)
        {
            myPopup = new Popup() { IsOpen = true, Child = new AnimatedSplashScreen() };
            backroungWorker = new BackgroundWorker();
            RunBackgroundWorker();

            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(10);

            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();

            someVariable = 1;
        }


    }

    #region timer
    void timer_Tick(object sender, EventArgs e)
    {

        if (imagesScrollview.HorizontalOffset == (listBox.ActualWidth - 483))
            imagesScrollview.ScrollToHorizontalOffset(10);
       imagesScrollview.ScrollToHorizontalOffset(imagesScrollview.HorizontalOffset +1);
        current = imagesScrollview.HorizontalOffset + 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...