Textbox.Text изменяется сам, не вызывая событие Textaged (не проблема связывания) - PullRequest
2 голосов
/ 20 июля 2011

Я новичок и создаю приложение для Wndows Phone 7.

Первое, что вы должны знать, это то, что мой код работает очень хорошо, когда я впервые загружаю страницу (от Меню до ConversationPage, с Меню, которое содержит список разговоров).Затем, если я использую жесткую кнопку, чтобы вернуться на страницу меню, и нажимаю на ту же беседу, чтобы снова загрузить ту же ConversationPage, проблема начинает возникать.

По сути, у меня есть текстовое поле с именем MessageBoxMessage и SendButton вapplicationBar.

Что я хочу: когда я нажимаю кнопку SendButton, она просматривает MessageBoxMessage.Text и отправляет это значение в функцию PostToWeb.

Проблема: когда я перезагружаю страницу, пишитечто-то в поле и нажмите SendButton, MessageBoxMessage.Text волшебным образом изменится на «» или «новое сообщение».

Я ввел точку останова в событии MessageBoxMessage_TextChanged и в начале события SendButton_Click, и значение приходитот "blablabla" (последнее время MessageBoxMessage_TextChanged запущено) до "" или "новое сообщение" (когда срабатывает SendButton_Click).

Я не могу понять, почему ... И у меня есть еще одна проблема, каскадная, так что я думаю, этобольшой вопрос для начинающих ... (Кстати, я проверил и событиеопределено только один раз)

Извините за мой английский, я надеюсь, что вы сможете помочь :) Большое спасибо

private void MessageBoxMessage_GotFocus(object sender, RoutedEventArgs e)
    {
        MessageBoxMessageHasFocus = true;

        if (MessageBoxMessage.Text == "new message")
        {
            MessageBoxMessage.Text = "";

            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else if (MessageBoxMessage.Text == "")
        {
            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else
        {
            SendButton.IsEnabled = true;
        }

    }

    private void MessageBoxMessage_LostFocus(object sender, RoutedEventArgs e)
    {
        MessageBoxMessageHasFocus = false;

        if (MessageBoxMessage.Text == "")
        {                
            MessageBoxMessage.Text = "new message";

            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else if (MessageBoxMessage.Text == "new message")
        {                
            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else
        {
            SendButton.IsEnabled = true;
        }

    }

    int MessageBoxMessageTextChangedCounter = 0;
    private void MessageBoxMessage_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (MessageBoxMessageTextChangedCounter == 0)
        {
            if ((MessageBoxMessage.Text != "" && MessageBoxMessage.Text != "new message") || hasPictureAttached == true)
            {
                SendButton.IsEnabled = true;
            }
            else { SendButton.IsEnabled = false; }

            MessageBoxMessageTextChangedCounter = 1;
            return;
        }
        else
        {
            MessageBoxMessageTextChangedCounter = 0;
        }

        if (MessageBoxMessage.Text != "" && MessageBoxMessage.Text != "new message")
        {
            MessageString = MessageBoxMessage.Text;
        }
    }


    private void SendButton_Click(object sender, EventArgs e)
    {
        if (MessageBoxMessage.Text == "new message" && hasPictureAttached == true)
        { MessageBoxMessage.Text = "";}


            SendButton.IsEnabled = false;
            if (hasPictureAttached == true)
            {
                //MessageString = MessageBoxMessage.Text;
                GetPictureUrl();
                hasPictureAttached = false;
            }
            else
            {
                //MessageString = MessageBoxMessage.Text;
                POSTmessage();
            }



        if (MessageBoxMessageHasFocus == true)
        {
            MessageBoxMessage.Text = "";
            MessageBoxMessage.SetValue(TextBox.TextProperty, "");
        }
        else
        {
            MessageBoxMessage.Text = "new message";
            MessageBoxMessage.SetValue(TextBox.TextProperty, "new message");
        }


    }

Ниже XAML

<TextBox x:Name="MessageBoxMessage" Margin="-12,0,-12,12" TextWrapping="Wrap" Foreground="Gray" TextChanged="MessageBoxMessage_TextChanged" LostFocus="MessageBoxMessage_LostFocus" GotFocus="MessageBoxMessage_GotFocus">
                        <TextBox.InputScope>
                            <InputScope>
                                <InputScopeName NameValue="Chat" />
                            </InputScope>
                        </TextBox.InputScope>
                    </TextBox>

1 Ответ

1 голос
/ 20 июля 2011

После запуска всего проекта ...

(спасибо, что предоставили его полностью по электронной почте. Это облегчило отладку) ...

Было несколько проблем собработчики событий, но фактическая причина ваших значений Magic заключается в том, что каждый раз, когда вы переходите к ConversationPage, создается новый объект ConversationPage, но предыдущие объекты не были уничтожены или использованы повторно.

Если вы уходите из ConversationPage более одного раза, вы фактически нажимаете свой SendButton_Click один раз для каждого экземпляра объекта ConversationPage , когда-либо созданного.

Причина этого в том, что ваш объект SendButton является одноэлементным, разделяемым между страницами, поэтому каждая подключенная к нему страница получает свое собственное событие щелчка.Наличие этой ссылки между страницей и статическим объектом SendButton означает, что страница беседы никогда не удаляется (она у вас на привязи!).

Вам необходимо удалить обработчик SendButton в ответ на OnNavigatedFromСобытие страницы, подобное этому:

SendButton.Click -= SendButton_Click;

Это удалит обработчик для текущей страницы и позволит ей умереть изящной смертью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...