手机上 TextBox.TextChanged 事件触发两次





0/5 (0投票)
解决 Windows Phone 7 模拟器中 TextBox TextChanged 事件触发两次的问题
我很少直接使用 TextChanged
事件… 但永远不要说永远!
我最近需要用到它,但出于某种奇怪的原因,每按下一个键,它就会触发两次。这是一个简化的问题示例。我添加了一个简单的 TextBlock
和 TextBox
<phone:PhoneApplicationPage
x:Class="TextBoxTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<StackPanel>
<TextBlock Text="Count: 0" x:Name="counterTextBlock" />
<TextBox x:Name="textBox" TextChanged="textBox_TextChanged" />
</StackPanel>
</phone:PhoneApplicationPage>
然后从 XAML 附加了 TextChanged
事件处理程序。该处理程序只是递增一个计数器并在屏幕上打印它
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}
int count = 0;
private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
count++;
counterTextBlock.Text = "Count: " + count;
}
}
运行它时,我每输入一个字母,它都会递增两次(听起来很奇怪,但请尝试一下)。
搜索了一番后,我找到了 这个 Stackoverflow 帖子(来自传奇人物 Jon Skeet)关于完全相同的问题。原来问题在于 TextBox
被样式化为 Metro 风格的方式… 这是原始模板的简化版本
<Style x:Key="SimplefiedTextBoxStyle" TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Grid Background="Transparent">
<Border x:Name="EnabledBorder">
<ContentControl x:Name="ContentElement" />
</Border>
<Border x:Name="DisabledOrReadonlyBorder"
Visibility="Collapsed">
<TextBox x:Name="DisabledOrReadonlyContent"
Text="{TemplateBinding Text}" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
注意第二个 TextBox
,如果你删除它… 事件只会触发一次(但你将无法区分禁用/只读状态)。