に多数のアイテムがあるアプリを開発していListBox
ます。
TextBox
ユーザーがフィルターを入力すると結果が得られるように、TextBox
をListBox
使用して検索を作成したいと考えています。
に多数のアイテムがあるアプリを開発していListBox
ます。
TextBox
ユーザーがフィルターを入力すると結果が得られるように、TextBox
をListBox
使用して検索を作成したいと考えています。
以前、WPF アプリケーション用に同様の機能を作成したことがあります。の項目について、検索されたテキストが強調表示されますDataGrid
。必要なのは、MultiValueConverter
アイテムのテキストと検索テキストを、強調表示された部分の要素TextBlock
を含む新しい に変換する だけです。Run
コンバータ
コンバーターは、テキストと検索テキストをTextBlock
インスタンスに変換します。インスタンスにRun
は、定義されたスタイルの一致の要素が含まれます。
public class TextToHighlightedTextConverter : IMultiValueConverter
{
public Style HighlightedTextStyle { get; set; }
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length > 0)
{
if (values.Length > 1)
{
var text = values[0] as string;
var searchText = values[1] as string;
if (!string.IsNullOrEmpty(text) && !string.IsNullOrEmpty(searchText))
{
var textParts = GetSplittedText(text, searchText);
var textBlock = new TextBlock();
foreach (string textPart in textParts)
{
textBlock.Inlines.Add(textPart.Equals(searchText, StringComparison.OrdinalIgnoreCase)
? new Run(textPart) {Style = HighlightedTextStyle ?? new Style()}
: new Run(textPart));
}
return textBlock;
}
}
return values[0];
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
private IEnumerable<string> GetSplittedText(string text, string searchText)
{
IList<string> textParts = new List<string>();
if (string.IsNullOrEmpty(searchText))
{
if (text.Length > 0)
{
textParts.Add(text);
}
}
else
{
while (text.Length > 0)
{
int searchIndex = text.IndexOf(searchText, StringComparison.OrdinalIgnoreCase);
if (searchIndex > -1)
{
if (searchIndex > 0)
{
string textInFrontOfMatch = text.Substring(0, searchIndex);
textParts.Add(textInFrontOfMatch);
}
textParts.Add(text.Substring(searchIndex, searchText.Length));
text = text.Remove(0, searchIndex + searchText.Length);
}
else
{
textParts.Add(text);
text = string.Empty;
}
}
}
return textParts;
}
}
xaml ファイルのコンバーター定義
xaml ファイルで、コンバーターを定義し、一致に使用するスタイルを設定します。
<Converters:TextToHighlightedTextConverter x:Key="TextToHighlightedTextConverter">
<Converters:TextToHighlightedTextConverter.HighlightedTextStyle>
<Style TargetType="{x:Type Run}">
<Setter Property="Background" Value="Orange" />
</Style>
</Converters:TextToHighlightedTextConverter.HighlightedTextStyle>
</Converters:TextToHighlightedTextConverter>
ListBox のコンバーターの使用
DataTemplate
の項目に対して を定義しますListBox
。これDataTemplate
はContentPresenter
、定義されたコンバーターによってコンテンツが設定される を使用します。
<ListBox ItemsSource={Binding YourItemsSource}>
<ListBox.ItemsTemplate>
<DataTemplate>
<ContentPresenter>
<ContentPresenter.Content>
<MultiBinding Converter="{StaticResource TextToHighlightedTextConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding Path="YourSearchTextSource" />
</MultiBinding.Bindings>
</MultiBinding>
</ContentPresenter.Content>
</ContentPresenter>
</DataTemplate>
</ListBox.ItemsTemplate>
</ListBox>
CollectionViewSource を使用すると、フィルタリングと検索に非常に役立ちます。
参照先: http://www.geoffhudik.com/tech/2010/10/14/wp7-in-app-searching-filtering.html