2012-12-22 15 views
8

ho bisogno di per evidenziare il risultato della ricerca in base al testo che viene immesso nella casella di testo in Windows Phone 7,Come evidenziare il risultato della ricerca sensibile al contesto in Windows Phone 7?

enter image description here

il codice WPF solito non funziona in Windows Phone 7.. Qualcuno dice come raggiungere questo obiettivo in Windows Phone 7

In realtà questa è la casella di riepilogo XAML che sto usando per compilare l'elenco di contatto,

<ListBox Name="ContactList" ItemsSource="{Binding}" Margin="14,85,14,28" Foreground="White" SizeChanged="ContactList_SizeChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Border BorderThickness="2" HorizontalAlignment="Left" VerticalAlignment="Center" BorderBrush="{StaticResource PhoneAccentBrush}" > 
          <Image Source="{Binding Converter={StaticResource ContactPictureConverter}}" Width="48" Height="48" Stretch="Fill" Name="img1" /> 
         </Border> 
         <TextBlock Name="ContactResults" Text="{Binding Path=DisplayName, Mode=OneWay}" FontSize="{StaticResource PhoneFontSizeExtraLarge}" Margin="18,8,0,0" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <TextBox Name="contactFilterString" Margin="0,0,0,528" TextChanged="contactFilterString_TextChanged" /> 

codice C#,

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Net; 
    using System.Windows; 
    //using System.Windows.Controls; 
    using System.Windows.Documents; 
    using System.Windows.Input; 
    using System.Windows.Media; 
    using System.Windows.Media.Animation; 
    using System.Windows.Shapes; 
    using Microsoft.Phone.Controls; 
    using Microsoft.Phone.UserData; 
    using Newtonsoft.Json; 
    using Newtonsoft.Json.Linq; 
    using System.Collections.ObjectModel; 
    using Microsoft.Phone.Shell; 
    using System.Windows.Controls; 
    using System.Windows.Media.Imaging; 
    using System.Text.RegularExpressions; 

    namespace SmartContactsApp 
    { 
public partial class MainPage : PhoneApplicationPage 
{ 
    private List<Address> lstAddress = new List<Address>(); 
    public string addressJson = string.Empty; 

    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
     CreateSecondaryTile(); 
    } 

    /// <summary> 
    /// To List all the Contacts. . . 
    /// </summary> 
    private void ContactListing() 
    { 
     ContactList.DataContext = null; 
     Contacts cons = new Contacts(); 
     cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted); 
     cons.SearchAsync(contactFilterString.Text, FilterKind.DisplayName, "Contacts"); 
    } 

    /// <summary> 
    /// To Fetch All Contacts from Mobile Contacts. . . 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    public void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) 
    { 
     try 
     { 
      ContactList.DataContext = e.Results; 

     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

    private void contactFilterString_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     ContactListing(); 
    } 
    } 

Come evidenziare in questo,

Grazie in anticipo!

risposta

5

l'ho fatto con l'aiuto di this

XAML:

<!--ContentPanel - place additional content here--> 
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <ListBox Name="ContactList" Margin="14,85,14,28" Foreground="White"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding DisplayName}" Width="450" TextWrapping="Wrap" FontSize="24" Visibility="Collapsed"/> 
         <RichTextBox Width="450" FontSize="24" Foreground="#FFFFFF"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <TextBox Name="contactFilterString" Margin="0,0,0,528" TextChanged="contactFilterString_TextChanged" /> 
    </Grid> 

C# Codice:

  private void contactFilterString_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     // ContactListing(); 
     SearchVisualTree(ContactList); 
     if (contactFilterString.Text == "") 
     { 
      ContactListing(); 
     } 
    } 

    private void SearchVisualTree(Action ContactListing) 
    { 
     SearchVisualTree(ContactList); 
    } 

    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; 
       HighlightText(); 
       break; 
      } 
      else 
      { 
       //ContactListing(); 
       SearchVisualTree(child); 
      } 
     } 
    } 

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

      int index = text.IndexOf(contactFilterString.Text); 
      int lenth = contactFilterString.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 }); 

       textBlock1.FontSize = 30; 
       textBlock1.Foreground = new SolidColorBrush(Colors.Black); 
      } 
      else 
      { 
       //textBlock1.Text = "No Match"; 

      } 
     } 

    } 

    /// <summary> 
    /// To List all the Contacts. . . 
    /// </summary> 
    private void ContactListing() 
    { 
     ContactList.DataContext = null; 
     Contacts cons = new Contacts(); 
     cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted); 
     cons.SearchAsync(contactFilterString.Text, FilterKind.DisplayName, "Contacts"); 
    } 

    /// <summary> 
    /// To Fetch All Contacts from Mobile Contacts. . . 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    public void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) 
    { 
     try 
     { 

      ContactList.DataContext = e.Results; 

     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

Grazie per l'aiuto!

1

Per un simile tipo di esigenza, ho fatto la seguente:

Per prima cosa ho preso la seguente come parte del mio modello di dati ListBox

<StackPanel Width="450"> 
    <TextBlock Text="{Binding text}" Width="450" TextWrapping="Wrap" FontSize="24" Visibility="Collapsed"/> 
    <RichTextBox Width="450" FontSize="24" Foreground="#FFFFFF"/> 
</StackPanel> 

Poi nel codice dietro: La lista che mi usando per legarsi alla ListBox è definito come segue

public List<Result> results { 
     get 
     { 
      return _results; 
     } 
     set 
     { 
      string x = null; 
      foreach (var item in value) 
      { 
       item.text2 = item.text; 
       if (!item.text.StartsWith("<Section")) 
        if(!item.text.Contains("</Run>")) 
       { 
        String xamlData = null; 
        var regx = new Regex(@query.Trim(), RegexOptions.IgnoreCase); 
        var matcches = regx.Matches(item.text); 
        x += matcches.Count; 
        if (matcches.Count > 0) 
        { 
         var match = @query.Trim(); 
         xamlData = Regex.Replace(item.text, match, "<Run Foreground="Blue" FontWeight=\"ExtraBold\">" + match + "</Run>", RegexOptions.IgnoreCase); 
        } 
        if (xamlData == null) 
         xamlData = item.text; 
        item.text = "<Section xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Paragraph>" + xamlData + "</Paragraph></Section>"; 
       } 
      } 
      _results = value; 
     } 
    } 

poi dopo aver ottenuto i risultati di ricerca, aggiungere quelli alla lista di cui sopra e quindi impostando come l'ItemsSource per il ListBox.

Ora arriva la parte critica del ListBox. Aggiungere un gestore listbox_SizeChanged evento come illustrato di seguito

private void listboxMyTimeline_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     for (int i = 0; i < listboxMyTimeline.Items.Count; i++) 
     { 
      ListBoxItem lbi2 = (ListBoxItem)(listboxMyTimeline.ItemContainerGenerator.ContainerFromIndex(i)); 
      if (lbi2 != null) 
      { 
       var ob = FindFirstElementInVisualTree<RichTextBox>(lbi2); 
       var ob2 = FindFirstElementInVisualTree<TextBlock>(lbi2); 
       ob.Xaml = ob2.Text; 
      } 
      else 
      { 
       var itm = listboxMyTimeline.Items.ElementAt(i); 
       lbi2 = (ListBoxItem)(listboxMyTimeline.ItemContainerGenerator.ContainerFromItem(itm)); 
       if (lbi2 != null) 
       { 
        var ob = FindFirstElementInVisualTree<RichTextBox>(lbi2); 
        var ob2 = FindFirstElementInVisualTree<TextBlock>(lbi2); 
        ob.Xaml = ob2.Text; 
       } 
      } 
     } 
    } 

Qualora il metodo FindFirstElementVisualTree è come questo

private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject 
    { 
     var count = VisualTreeHelper.GetChildrenCount(parentElement); 
     if (count == 0) 
      return null; 

     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(parentElement, i); 

      if (child != null && child is T) 
      { 
       return (T)child; 
      } 
      else 
      { 
       var result = FindFirstElementInVisualTree<T>(child); 
       if (result != null) 
        return result; 

      } 
     } 
     return null; 
    } 

Quindi, io sto prendendo una casella di testo nascosta a cui sto legando il codice XAML costruito del testo vero e proprio. Questo perché non puoi collegarti direttamente agli elementi RichTextBox o Run. Quindi, nel gestore Size_changed, imposto il codice XAMl sul RichTextBox visibile.

non sono sicuro fino a che punto si adatta alle vostre esigenze, potrebbe essere necessario fare molte modifiche al processo di cui sopra inorder per farlo funzionare per voi.

Buona fortuna :)

UPDATE:

Sostituire la classe Risultato nel mio codice con la classe indirizzo nel codice.

E Sostituire la definizione Elenco con la mia lista.

Aggiungi una proprietà aggiuntiva denominata 'xamlCode' nella classe Address. (Sostituire la linea item.text2 = item.text come item.xamlCode = item.DisplayName

E il resto dovrebbe essere chiaro per voi.

Eppure se c'è ne dubita, Ask here.

+0

Grazie per la risposta Sir. . . –

+0

In realtà non riesco ad ordinare n @ query.trim(). puoi spiegarmi che ... –

+0

Ho dimenticato di menzionarlo. In realtà è la parola che vuoi evidenziare – nkchandra