xaml - 搜索结果 TextHighlighter 或 TextRange 是否可以绑定到 UWP XAML 中的 DataTemplate?
问题描述
我有一个SearchResult
绑定到ListView
. 我特别想做的是突出显示搜索结果文本中与用户输入的查询匹配的片段。
相关的 XAML 看起来像这样(省略绒毛):
<DataTemplate>
<StackPanel>
<!-- Search result -->
<RichTextBlock>
<!-- Would this idea work? -->
<RichTextBlock.TextHighlighters>
<TextHighlighter>
<TextHighlighter.Ranges>
<!-- Add the bound range here-->
<!-- {Binding Range} or text highlighter or something -->
</TextHighlighter.Ranges>
</TextHighlighter>
</RichTextBlock.TextHighlighters>
<Paragraph>
<Run Text="{Binding Text}"></Run>
</Paragraph>
</RichTextBlock>
</StackPanel>
</DataTemplate>
我可以添加SearchResult
类中的任何属性,无论是 aTextHighlighter
还是TextRange
. 我只是不知道 XAML 语法是否允许插入该值。
我也想过在代码中这样做,但我确实想将搜索项模板保留在 XAML 中,而不是将其放在 C# 中。但是,可以做一些类似lvSearchResults.Items[i]...
或任何事情来放入荧光笔或范围。我现在只是想不出正确的方法。
解决方案
如果您打算创建一个本地突出显示的搜索结果列表,您可以尝试这种方式:
- 创建搜索结果类
public class SearchResult
{
public string DisplayText { get; set; }
public string HighlightText { get; set; }
}
- 创建一个
UserControl
以显示结果
搜索结果块.xaml
<Grid>
<TextBlock x:Name="ResultBlock" TextWrapping="Wrap" MaxLines="2"
TextTrimming="CharacterEllipsis"/>
</Grid>
SearchResultBlock.xaml.cs
public sealed partial class SearchResultBlock : UserControl
{
public SearchResultBlock()
{
this.InitializeComponent();
}
public SearchResult Result
{
get { return (SearchResult)GetValue(ResultProperty); }
set { SetValue(ResultProperty, value); }
}
public static readonly DependencyProperty ResultProperty =
DependencyProperty.Register("Result", typeof(SearchResult), typeof(SearchResultBlock), new PropertyMetadata(null,new PropertyChangedCallback(Result_Changed
private static void Result_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if(e.NewValue!=null && e.NewValue is SearchResult data)
{
var instance = d as SearchResultBlock;
instance.ResultBlock.Inlines.Clear();
var sp = data.DisplayText.Split(data.HighlightText);
instance.ResultBlock.Inlines.Add(new Run { Text = sp.First() });
instance.ResultBlock.Inlines.Add(new Run { Text = data.HighlightText, Foreground = new SolidColorBrush(Colors.Red) });
if (sp.Length > 1)
instance.ResultBlock.Inlines.Add(new Run { Text = sp.Last() });
}
}
}
- 使用它
DataTemplate
<DataTemplate x:DataType="SearchResult" x:Key="ResultItemTemplate">
<SearchResultBlock Result="{Binding}"/>
</DataTemplate>
通过字符串拆分,创建不同类型的Run
s 并将它们合并到TextBlock
. 这样也能达到高亮的效果。
此致。
推荐阅读
- asp.net-mvc - 首先在asp.net代码中以多种方式连接两个上下文模型
- excel - EXCEL - 使用姓名和日期最后一次出现之间的天数
- android - 我需要在 Android 上以 PIP 模式使用 ExoPlayer 显示全屏视频
- html - Div 类最小宽度仍在调整大小
- fabricjs - Fabric JS 2.4.1 使用复制/粘贴示例时出现问题,对象卡在剪贴板中
- service - 在一台机器上部署两个服务
- javascript - Javascript Vue 事件发出不值
- css - Button 组件的覆盖不会改变悬停颜色
- jsf - Jboss X JSF 实现版本矩阵是什么?
- asp.net - 使用gridview制作表格