У меня очень простое тестовое приложение, чтобы поиграться с Windows Phone 7. Я только что добавил TextBox
и TextBlock
на стандартный шаблон пользовательского интерфейса. Единственный пользовательский код:
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}
private int counter = 0;
private void TextBoxChanged(object sender, TextChangedEventArgs e)
{
textBlock1.Text += "Text changed " + (counter++) + "\r\n";
}
}
Текстовое поле . Событие TextChanged
связано с TextBoxChanged
в XAML:
Однако каждый раз, когда я нажимаю клавишу во время работы в эмуляторе (экранной или физической, нажав Пауза для включения последнего) увеличивает счетчик вдвое, отображая две строки в TextBlock
. Все, что я пробовал, показывает, что событие действительно дважды запускается, и я не знаю почему. Я проверил, что на него подписывается только один раз - если я отписываюсь в конструкторе MainPage
, ничего не происходит (с текстовым блоком) при изменении текста.
Я попробовал эквивалентный код в обычном приложении Silverlight, и там его не было. У меня нет физического телефона, чтобы воспроизвести это на данный момент. У меня нет Я не нашел никаких записей об этой известной проблеме в Windows Phone 7.
Может кто-нибудь объяснить, что я делаю неправильно, или я должен сообщить об этом как об ошибке?
РЕДАКТИРОВАТЬ: Чтобы уменьшить вероятность этого существа вплоть до двух текстовых элементов управления я попытался полностью удалить TextBlock
и изменить метод TextBoxChanged на , просто увеличить счетчик
. Затем я запустил эмулятор, набрал 10 букв и затем , а затем установил точку останова в строке counter ++;
(просто чтобы избавиться от любой вероятности того, что взлом в отладчике вызывает проблемы. ) - и он показывает счетчик
как 20.
РЕДАКТИРОВАТЬ: Я сейчас спросил на форуме Windows Phone 7 ... посмотрим, что произойдет.
Я бы пошел на ошибку, в основном потому, что если вы поместите туда события KeyDown
и KeyUp
, это показывает, что они запускаются только один раз (каждое из них), но событие TextBoxChanged
запускается дважды
Заявление об ограничении ответственности - я не знаком с нюансами xaml и знаю, что это звучит нелогично ... но в любом случае - моя первая мысль - попробовать передавать как простые аргументы событий, а не textchangedeventargs. Не имеет смысла, но, может быть, это поможет? Похоже, что когда я раньше видел подобные двойные срабатывания, это либо из-за ошибки, либо из-за того, что за кулисами происходили 2 вызова обработчика событий добавления ... Я не уверен, что именно?
Если вы нужно быстро и грязно, опять же, у меня нет опыта работы с xaml - моим следующим шагом было бы просто пропустить xaml для этого текстового поля в качестве быстрого обходного пути ... сделайте это текстовое поле полностью на С #, пока вы не сможете точно определить ошибку или сложный код ... то есть, если вам нужно временное решение.
Конечно, мне кажется, что это ошибка, если вы пытаетесь инициировать событие каждый раз, когда текст изменяется, вы можете попробовать использовать вместо этого двустороннюю привязку, к сожалению, это не приведет к увеличению - нажатие клавиши меняет события (только когда поле теряет фокус). Вот обходной путь, если он вам нужен:
this.textBox1.TextChanged -= this.TextBoxChanged;
textBlock1.Text += "Text changed " + (counter++) + "\r\n";
this.textBox1.TextChanged += this.TextBoxChanged;
Я считаю, что это всегда было ошибкой в Compact Framework. Должно быть, она была перенесена в WP7.