windows phone 中 textBox1_TextChanged 的​​性能变慢

Posted

技术标签:

【中文标题】windows phone 中 textBox1_TextChanged 的​​性能变慢【英文标题】:getting slower performance in textBox1_TextChanged in windows phone 【发布时间】:2013-12-12 06:34:05 【问题描述】:

我的应用中有一个搜索文本框。在我的数据库中有两列名为 English 和 Bangla。我可以搜索孟加拉语或英语。搜索文本框旁边有一个按钮。默认情况下,英文搜索已激活。我可以通过单击按钮更改搜索选项。它工作正常,但问题是搜索速度很慢。 点击按钮搜索选项选择代码为:

private void button5_Click(object sender, RoutedEventArgs e)

    if (SearchMood % 2 != 0)
    
        //search bangla column from the database
        button5.Content = "Eng";
    
    else 
        //search english column from the database
        button5.Content = "Bng";
    

    SearchMood++;

搜索代码为:

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)

    List<dataLists> mylist = new List<dataLists>();

    string word = textBox1.Text;

    try
    
        if (SearchMood % 2 == 0)// for english search
        
            // show 5 words in listbox matched with entered text
            var contacts = (from m in db.Dics where m.English.StartsWith(word) select new  m.English, m.Bangla ).Take(5);

            string s1, s2;

            try
            
                foreach (var a in contacts)
                
                    s1 = a.English;
                    s2 = a.Bangla;

                    mylist.Add(new dataLists()  Eng = s1, Bng = s2 );
                
            
            catch (Exception ex)  MessageBox.Show(ex.ToString()); 

            listBox1.ItemsSource = mylist;
        

        else // for bangla search
        
            // show 5 words in listbox matched with entered text
            var contacts = (from m in db.Dics where m.Bangla.StartsWith(word) select new  m.English, m.Bangla ).Take(5);

            string s1, s2;

            try
            
                foreach (var a in contacts)
                
                    s1 = a.English;
                    s2 = a.Bangla;

                    mylist.Add(new dataLists()  Eng = s1, Bng = s2 );
                
            
            catch (Exception ex)  MessageBox.Show(ex.ToString()); 

            listBox1.ItemsSource = mylist;
        
    
    catch  

如何提高搜索性能???任何人都可以提供任何解决方案|???

N:B:我的表创建脚本看起来像

    public System.Data.Linq.Table<Dic> Dics
    
        get
        
            return this.GetTable<Dic>();
        
    

    public System.Data.Linq.Table<Learn_table> Learn_tables
    
        get
        
            return this.GetTable<Learn_table>();
        
    


[global::System.Data.Linq.Mapping.TableAttribute(Name="dic")]
public partial class Dic : INotifyPropertyChanging, INotifyPropertyChanged

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _Serial;

    private string _English;

    private string _Bangla;

    private System.Nullable<int> _Fav;

    #region Extensibility Method Definitions
    partial void OnLoaded();
    partial void OnValidate(System.Data.Linq.ChangeAction action);
    partial void OnCreated();
    partial void OnSerialChanging(int value);
    partial void OnSerialChanged();
    partial void OnEnglishChanging(string value);
    partial void OnEnglishChanged();
    partial void OnBanglaChanging(string value);
    partial void OnBanglaChanged();
    partial void OnFavChanging(System.Nullable<int> value);
    partial void OnFavChanged();
    #endregion

    public Dic()
    
        OnCreated();
    

    [global::System.Data.Linq.Mapping.ColumnAttribute(Name="serial", Storage="_Serial", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
    public int Serial
    
        get
        
            return this._Serial;
        
        set
        
            if ((this._Serial != value))
            
                this.OnSerialChanging(value);
                this.SendPropertyChanging();
                this._Serial = value;
                this.SendPropertyChanged("Serial");
                this.OnSerialChanged();
            
        
    

    [global::System.Data.Linq.Mapping.ColumnAttribute(Name="english", Storage="_English", DbType="NVarChar(2000)")]
    public string English
    
        get
        
            return this._English;
        
        set
        
            if ((this._English != value))
            
                this.OnEnglishChanging(value);
                this.SendPropertyChanging();
                this._English = value;
                this.SendPropertyChanged("English");
                this.OnEnglishChanged();
            
        
    

    [global::System.Data.Linq.Mapping.ColumnAttribute(Name="bangla", Storage="_Bangla", DbType="NVarChar(2000)")]
    public string Bangla
    
        get
        
            return this._Bangla;
        
        set
        
            if ((this._Bangla != value))
            
                this.OnBanglaChanging(value);
                this.SendPropertyChanging();
                this._Bangla = value;
                this.SendPropertyChanged("Bangla");
                this.OnBanglaChanged();
            
        
    

    [global::System.Data.Linq.Mapping.ColumnAttribute(Name="fav", Storage="_Fav", DbType="Int")]
    public System.Nullable<int> Fav
    
        get
        
            return this._Fav;
        
        set
        
            if ((this._Fav != value))
            
                this.OnFavChanging(value);
                this.SendPropertyChanging();
                this._Fav = value;
                this.SendPropertyChanged("Fav");
                this.OnFavChanged();
            
        
    

    public event PropertyChangingEventHandler PropertyChanging;

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void SendPropertyChanging()
    
        if ((this.PropertyChanging != null))
        
            this.PropertyChanging(this, emptyChangingEventArgs);
        
    

    protected virtual void SendPropertyChanged(String propertyName)
    
        if ((this.PropertyChanged != null))
        
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        
    

【问题讨论】:

【参考方案1】:

您的问题出现在使用TextChanged 事件处理程序。在那里放置一个断点,你会看到它触发了两次,从而导致你的性能变慢。这似乎是 WP7 TextBox 控件中的一个错误。

使用KeyUp 事件处理程序,而不是textBox1_TextChanged

void textBox1_KeyUp(object sender, KeyEventArgs e)

   //your code

希望这能解决您的问题。 !!

【讨论】:

【参考方案2】:

您可以使用 AutoCompleteBox 而不是使用 TextBox。 Microsoft.Phone.Control.Toolkit 中提供了 AutoCompleteBox。 当您在 buttonClick 上选择语言并将查询结果分配给 AutoCompleteBox.Itemsource 时,立即执行您选择查询。它应该真正提高搜索性能。

 <toolkit:AutoCompleteBox  x:Name="AutoBoxFood"  Width="440" SelectionChanged="txtFodd_SelectionChanged"  FilterMode="StartsWith" HorizontalAlignment="Left"  Height="70"/>

【讨论】:

但是我必须在我用来显示搜索结果的列表框的每一行中实现 2 个按钮操作。 @Jaihind【参考方案3】:

为数据库文件中的列添加索引。

【讨论】:

我的表名是 'dic',我发现 itz 索引名是 PK_dic。我在我的代码中查询了 var contacts = (from m in db.Dics where m.English.StartsWith(word) select new m.English, m.Bangla ).Take(5);现在我需要做什么?? @ErikEJ 我使用了现有的数据库。这是完整的架构dropbox.com/s/r0dcpdpkoloq8gn/mydatabase.cs 当我用 "SELECT * FROM INFORMATION_SCHEMA.INDEXES" 查询时,我发现我的 "dic" 表的 index_name 是 "PK_dic" 。你有什么解决办法吗?? @ErikEJ 你需要将文件复制到桌面并添加索引,或者至少使用我的工具创建一个CREATE TABLE语句,显示代码没有帮助。 我用你的工具来使用现有的数据库

以上是关于windows phone 中 textBox1_TextChanged 的​​性能变慢的主要内容,如果未能解决你的问题,请参考以下文章

windows phone 存储图片 数据库写法

如何使用 Windows Phone 8 SDK 将类序列化为 XML?

window.open链接未在Windows Phone 8的cordova应用中打开

获取windows phone唯一id

为 Windows Phone 8.1 XAML 应用程序显示的奇怪版本

即使应用程序在后台运行或手机被锁定在 Windows Phone 中,如何让计时器运行