I have a very simple test app just to play around with Windows Phone 7. I've just added a TextBox
and a TextBlock
to the standard UI template. The only custom code is the following:
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";
}
}
The TextBox.TextChanged
event is wired up to TextBoxChanged
in the XAML:
<TextBox Height="72" HorizontalAlignment="Left" Margin="6,37,0,0"
Name="textBox1" Text="" VerticalAlignment="Top"
Width="460" TextChanged="TextBoxChanged" />
However, every time I press a key when running in the emulator (either the on-screen keyboard or the physical one, having pressed Pause to enable the latter) it increments the counter twice, displaying two lines in the TextBlock
. Everything I've tried shows that the event is genuinely firing twice, and I've no idea why. I've verified that it's only being subscribed once - if I unsubscribe in the MainPage
constructor, nothing happens at all (to the text block) when the text changes.
I've tried the equivalent code in a regular Silverlight app, and it didn't occur there. I don't have a physical phone to reproduce this with at the moment. I haven't found any record of this being a known problem in the Windows Phone 7.
Can anyone explain what I'm doing wrong, or should I report this as a bug?
EDIT: To reduce the possibility of this being down to having two text controls, I've tried removing the TextBlock
completely, and changing the TextBoxChanged method to just increment counter
. I've then run in the emulator, typed 10 letters and then put a breakpoint on the counter++;
line (just to get rid of any possibility that breaking into the debugger is causing issues) - and it shows counter
as 20.
EDIT: I've now asked in the Windows Phone 7 forum... we'll see what happens.
The reason the TextChanged
event fires twice in WP7 is a side effect of how the TextBox
has been templated for the Metro look.
If you edit the TextBox
template in Blend you will see that it contains a secondary TextBox
for the disabled/read-only state. This causes, as a side effect, the event to fire twice.
You can change the template to remove the extra TextBox
(and associated states) if you don't need these states, or modify the template to achieve a different look in the disabled/read-only state, without using a secondary TextBox
.
With that, the event will fire only once.