8

Windows Phone 7のテキストボックスに入力されたテキストに従って、検索結果を強調表示する必要があります。

ここに画像の説明を入力してください

通常のwpfコードはWindowsPhone7では機能しません。誰かがWindowsPhone7でこれを達成する方法を言います

実際、これは連絡先リストに入力するために使用しているxamlリストボックスです。

    <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" />

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();
    }
    }

これでハイライトする方法、

前もって感謝します!

4

2 に答える 2

5

私はこれの助けを借りてそれをしまし

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#コード:

            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;
        }
    }

助けてくれてありがとう!

于 2012-12-28T06:44:28.610 に答える
1

同様の種類の要件について、私は次のことを行いました。

まず、ListBoxデータテンプレートの一部として次のものを使用しました

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

次に、コードビハインドで:ListBoxにバインドするために使用しているリストは次のように定義されています

 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;
        }
    }

次に、検索結果を取得したら、それらを上記のリストに追加し、リストボックスのItemsSourceとして設定します。

次に、リストボックスの重要な部分があります。listbox_SizeChanged以下に示すように、イベントハンドラーを追加します

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;
                }
            }
        }
    }

FindFirstElementVisualTreeメソッドは次のようになります

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;
    }

そのため、実際のテキストで作成されたXAMLコードをバインドする非表示のテキストボックスを使用しています。これは、RichTextBox要素またはRun要素に直接バインドできないためです。次に、Size_changedハンドラーで、そのXAMlコードを表示されているRichTextBoxに設定しています。

それがあなたのニーズにどの程度適しているかはわかりません。それを機能させるには、上記のプロセスに多くの変更を加える必要があるかもしれません。

幸運を :)

アップデート:

コードのResultクラスをコードのAddressクラスに置き換えます。

そして、リスト定義を私のリストに置き換えます。

Addressクラスに「xamlCode」というプロパティを追加します。(item.text2 = item.text行をitem.xamlCode=item.DisplayNameとして置き換えます

そして、残りはあなたにとって明確でなければなりません。

それでも疑問がある場合は、ここで質問してください

于 2012-12-22T13:11:28.113 に答える