65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011 年 4 月 4 日

CPOL
viewsIcon

13720

解决 Windows Phone 7 模拟器中 TextBox TextChanged 事件触发两次的问题

我很少直接使用 TextChanged 事件… 但永远不要说永远!

我最近需要用到它,但出于某种奇怪的原因,每按下一个键,它就会触发两次。这是一个简化的问题示例。我添加了一个简单的 TextBlockTextBox

<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,如果你删除它… 事件只会触发一次(但你将无法区分禁用/只读状态)。

© . All rights reserved.