Я получаю сообщение об ошибке: имя не может быть найдено в области имен - при переходе от страницы к странице в приложении MVVMLight - PullRequest
0 голосов
/ 23 июня 2018

У меня есть MVVMLight многостраничное приложение, которое имеет две страницы, я могу переходить с одной страницы на другую, нажимая соответствующие кнопки.

На второй странице у меня есть анимация загрузчика, которая срабатывает каждый раз, когда что-то вводится в поле textBox.Все работает нормально;с первой страницы я могу перейти на вторую страницу, затем вы набираете что-то в textBox и начинается анимация.Проблема заключается в том, что если я перехожу на вторую страницу, то я возвращаюсь на первую страницу, а затем снова перехожу на вторую страницу и набираю что-то в textBox. Я получаю сообщение об ошибке, которое говорит, что имя загрузчика нене существует, забавно то, что я не получаю эту ошибку, пока не покину страницу и не вернусь.

Есть идеи, почему анимация перестает работать после ухода со страницы и возвращения?

РЕДАКТИРОВАТЬ : Вот ссылка на полный проект.https://www.dropbox.com/sh/yf87shw5rzxtxen/AAClTesIGpLKl6IzV-6pjfEfa?dl=0

Чтобы повторить ошибку, сделайте следующее ...

  1. Скачайте и откройте приложение.

  2. Перейти на страницу2.

  3. Введите что-нибудь в текстовое поле (анимация должна запуститься).

  4. Вернитесь на страницу 1, ничего не делайте.

  5. Снова перейдите на страницу 2 и попробуйте набрать что-нибудь в текстовом поле (здесь должна появиться ошибка).

Ошибка:

Дополнительная информация: имя 'rectangleLoader' не может быть найдено в области имен 'TwoViews.Views.SecondView'.

enter image description here

XAML

<UserControl x:Class="TwoViews.Views.SecondView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             d:DesignHeight="300"
             d:DesignWidth="300"
             mc:Ignorable="d">
    <Grid>
        <Rectangle x:Name="rectangleLoader" Fill="#FFB2B2FF" HorizontalAlignment="Left" Height="19" Margin="26,89,0,0" VerticalAlignment="Top" Width="248"/>
        <TextBox x:Name="textBoxFileName" 
                     HorizontalAlignment="Left" 
                     Height="35" Width="180" 
                     Margin="26,125,0,0" 
                     VerticalAlignment="Top" 
                     Text="{Binding InputFileNameChanged, UpdateSourceTrigger=PropertyChanged}" FontSize="18"/>
    </Grid>
</UserControl>

SecondView.xaml.cs

namespace TwoViews.Views
{
    public partial class SecondView : UserControl
    {
        private Storyboard loaderStoryboard;

        public SecondView()
        {
            InitializeComponent();

            Messenger.Default.Register<MessageSearchStatus>(this, messageSearchStatus => ReceivedSearchStatus(messageSearchStatus));

            /// Animation for loader
            DoubleAnimation myDoubleAnimation = new DoubleAnimation();
            myDoubleAnimation.From = 100;
            myDoubleAnimation.To = 0;
            myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(.1));
            myDoubleAnimation.AutoReverse = true;
            myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;

            loaderStoryboard = new Storyboard();
            loaderStoryboard.Children.Add(myDoubleAnimation);
            Storyboard.SetTargetName(myDoubleAnimation, rectangleLoader.Name);
            Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.WidthProperty));
        }

        private void ReceivedSearchStatus(MessageSearchStatus message)
        {
            loaderStoryboard.Begin(this, true);
        }

        /// I manually stop the animation before going to other screens
        private void stopAnimation_Click(object sender, System.Windows.RoutedEventArgs e)
        {
           loaderStoryboard.Stop(this);
        }

    }
}

ViewModel

namespace TwoViews.ViewModels
{
    public class SecondViewModel : ViewModelBase
    {
        private string _inputFileName;

        public string InputFileNameChanged
        {
            get { return _inputFileName; }
            set {
                // send message to start animation everytime the textBox changes
                Messenger.Default.Send<MessageSearchStatus>(new MessageSearchStatus { isSearchingFile = true });
            }
        }
    }
}

Обратите внимание, что в моем коде I 'я не показываю код, который останавливает анимацию.

Опять же, анимация работает нормально, пока пользователь не покинет страницу, где анимация, и не вернется.

Спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

К вашему сведению - проблема, похоже, была Storyboard, которую я использовал с анимацией. Убрал Storyboard и все отлично работает.

SecondView.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;
using System;
using System.Windows.Input;
using GalaSoft.MvvmLight.Messaging;
using GalaSoft.MvvmLight.Threading;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Collections.Specialized;
using System.Linq;
using System.Windows.Shapes;
using TwoViews.Models;
using System.Windows.Media;

namespace TwoViews.Views
{
    public partial class SecondView : UserControl
    {
        private DoubleAnimation myDoubleAnimation;

        public SecondView()
        {
            InitializeComponent();

            Messenger.Default.Register<MessageSearchStatus>(this, messageSearchStatus => ReceivedSearchStatus(messageSearchStatus));

            /// Animation for loader
            myDoubleAnimation = new DoubleAnimation();
            myDoubleAnimation.From = 100;
            myDoubleAnimation.To = 0;
            myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(.1));
            myDoubleAnimation.AutoReverse = true;
            myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
        }

        private void ReceivedSearchStatus(MessageSearchStatus message)
        {
            rectangleLoader.BeginAnimation(Rectangle.WidthProperty, myDoubleAnimation);
        }

        private void stopAnimation_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            rectangleLoader.BeginAnimation(Rectangle.WidthProperty, null);
        }
    }
}
...