2014-10-04 61 views
0

我正在下載一個xml文件並將其保存到手機(Windows Phone 8應用程序),然後將其作爲列表打開。這份清單中有希臘文字,包括上,下和特殊字符。我希望用戶能夠通過這個列表進行搜索,而不用讓他寫出與列表中相同的文本,所以,到目前爲止,我已經將搜索欄和列表變成了大寫字母,所以如果用戶輸入「to」該列表突出顯示「to」,「To」,「TO」,暫時擦除不匹配的單詞。但是,如果用戶試圖寫出一個沒有語調的字母,則列表中具有語調的單詞將全部擦除,直到用戶按下退格鍵並用語調輸入該字母。替換列表中的特殊字符,以便您可以輕鬆搜索

例如:列表中有2個單詞。 Σπύρος,Μάρα。 用戶按下列表中的字母'Μ',Σπύρος消失,並且Μάρα變爲Μάρα。現在用戶鍵入'α'並且M也會消失,因爲他必須鍵入'ά'。如果他有,它會是Μάρα等。

所以我的問題是,是否可以用沒有語調的相同字符替換一個帶有語調的字符?例如。 í到a,Ά到A等。在Unicode字符表上它們有不同的代碼。

至今代碼:

private void businessFilterString_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     sI.ItemsSource = businesses.Collection.Where(b => b.name.ToUpper().Contains(searchBox.Text.ToUpper()) || b.address.ToUpper().Contains(searchBox.Text.ToUpper())).ToList(); 
     LayoutUpdateFlag = true; 
    } 

    private void sI_LayoutUpdated(object sender, EventArgs e) 
    { 
     if (LayoutUpdateFlag) 
     { 
      SearchVisualTree(sI); 
     } 
     LayoutUpdateFlag = false; 
    } 
    private void SearchVisualTree(DependencyObject targetElement) 
    { 

     var count = VisualTreeHelper.GetChildrenCount(targetElement); 

     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(targetElement, i); 
      if (child is TextBlock) 
      { 
       textBlock1 = (TextBlock)child; 
       prevText = textBlock1.Text.ToUpper(); 
       HighlightText(); 
      } 
      else 
      { 
       SearchVisualTree(child); 
      } 
     } 
    } 

    private void HighlightText() 
    { 
     if (textBlock1 != null) 
     { 
      string text = textBlock1.Text.ToUpper(); 
      textBlock1.Text = text; 
      textBlock1.Inlines.Clear(); 

      int index = text.IndexOf(searchBox.Text.ToUpper()); 
      int lenth = searchBox.Text.Length; 


      if (!(index < 0)) 
      { 
       Run run = new Run() { Text = text.Substring(index, lenth), FontWeight = FontWeights.ExtraBold}; 
       run.Foreground = new SolidColorBrush(Colors.Orange); 
       textBlock1.Inlines.Add(new Run() { Text = text.Substring(0, index), FontWeight = FontWeights.Normal}); 
       textBlock1.Inlines.Add(run); 
       textBlock1.Inlines.Add(new Run() { Text = text.Substring(index + lenth), FontWeight = FontWeights.Normal }); 
      } 
      else 
      { 
       //textBlock1.Text = "No Match"; 
      } 
     } 
    } 
+1

可能的重複http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net – Mrchief 2014-10-04 15:37:02

+0

謝謝。我會檢查一下,看看它是否也適用於我的案例! – 2014-10-04 21:52:14

回答

0

所以我添加

private static string DeleteAccentAndSpecialsChar(string OriginalText) 
    { 
     string strTemp = OriginalText; 

     Regex rega = new Regex("[Ά]"); 
     Regex rege = new Regex("[Έ]"); 
     Regex regi = new Regex("[Ί]"); 
     Regex regu = new Regex("[Ύ]"); 
     Regex regh = new Regex("[Ή]"); 
     Regex rego = new Regex("[Ό]"); 
     Regex regw = new Regex("[Ώ]"); 

     strTemp = rega.Replace(strTemp, "Α"); 
     strTemp = rege.Replace(strTemp, "Ε"); 
     strTemp = regi.Replace(strTemp, "Ι"); 
     strTemp = regu.Replace(strTemp, "Υ"); 
     strTemp = regh.Replace(strTemp, "Η"); 
     strTemp = rego.Replace(strTemp, "Ο"); 
     strTemp = regw.Replace(strTemp, "Ω"); 

     return strTemp; 
    } 

,改變

private void businessFilterString_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    sI.ItemsSource = businesses.Collection.Where(b => b.name.ToUpper().Contains(searchBox.Text.ToUpper()) || b.address.ToUpper().Contains(searchBox.Text.ToUpper())).ToList(); 
    LayoutUpdateFlag = true; 
} 

private void businessFilterString_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     sI.ItemsSource = businesses.Collection.Where(b => DeleteAccentAndSpecialsChar(b.name.ToUpper()).Contains(DeleteAccentAndSpecialsChar(searchBox.Text.ToUpper()))).ToList(); 
     LayoutUpdateFlag = true; 
    } 

這樣所有的文字都顯示在上面,語調消失。如果用戶在他的文本中使用語調,則不會顯示任何東西,但對我來說很合適,因爲上面的文本不需要語調。