- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个文本框和列表框。用户可以从 TextBox 中搜索 ListBox 元素。
ListBox 绑定(bind)到 CollectionViewSource。
CollectionViewSource 具有 Filter 事件处理程序,它根据用户在 TextBox 中输入的文本过滤元素。
我的要求是在 ListBoxItem 元素的 TextBlock 中突出显示用户输入的文本。
我正在考虑将 TextBlock 分解为几个 Runs 对象并修改需要突出显示的 Run 对象的 Background 属性。
我认为不可能使用 DataTemplates。
有没有简单的方法可以做到这一点?
谢谢!
最佳答案
更新:我在 this blog post 中详细阐述了这个主题。 .
我不认为有任何简单的方法可以做到这一点,但这是我解决这个问题的方法:
TextBlock
的 Background
设置为索引。使用转换器将索引转换为 GradientBrush
在两个索引之间呈亮黄色(或其他)。我认为您可以通过以下方式计算出 TextBlock
突出显示部分的尺寸:
TextBlock.ContentStart
属性获取 TextPointer
。LogicalDirection.Forwards
调用 TextPointer.GetPositionAtOffset(indexOfStart)
移动到选择的开头。LogicalDirection.Backwards
调用 TextPointer.GetPositionAtOffset(indexOfStart)
移动到选择的末尾。TextPointer.GetCharacterRect
获取高亮内容的边界Rectangle
。说实话,我不确定最后一点是否有效。我必须自己尝试一下,我可能会为博客文章这样做。
编辑:刚刚有时间亲自尝试一下。它确实有效,尽管我上面的逻辑略有改变。下面是演示的代码。截图如下:
Screenshot http://img219.imageshack.us/img219/2969/searchx.png
Window1.xaml:
<Window x:Class="TextSearch.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1">
<StackPanel>
<TextBox x:Name="_searchTextBox"/>
<Grid>
<Path Fill="Yellow" Stroke="Black" StrokeThickness="0">
<Path.Data>
<RectangleGeometry x:Name="_rectangleGeometry"/>
</Path.Data>
</Path>
<TextBlock x:Name="_textBlock">Some sample text that you can search through by typing in the above TextBox.</TextBlock>
</Grid>
</StackPanel>
</Window>
Window1.xaml.cs:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace TextSearch
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
_searchTextBox.TextChanged += _searchTextBox_TextChanged;
}
void _searchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var searchText = _searchTextBox.Text;
var index = _textBlock.Text.IndexOf(searchText);
if (index == -1)
{
_rectangleGeometry.Rect = Rect.Empty;
}
else
{
var textPointer = _textBlock.ContentStart;
textPointer = textPointer.GetPositionAtOffset(index + 1, LogicalDirection.Forward);
var leftRectangle = textPointer.GetCharacterRect(LogicalDirection.Forward);
textPointer = textPointer.GetPositionAtOffset(searchText.Length, LogicalDirection.Backward);
var rightRectangle = textPointer.GetCharacterRect(LogicalDirection.Forward);
_rectangleGeometry.Rect = new Rect(leftRectangle.TopLeft, rightRectangle.BottomRight);
}
}
}
}
我认为代码是不言自明的。显然,您需要将该概念扩展到您的特定场景。您可能更喜欢将 TextBlock
的 Background
属性与 DrawingBrush
或 GradientBrush
结合使用,而不是使用单独的路径
.
关于.net - WPF Listbox 突出显示 ListBoxItem 元素的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/798579/
有没有一种方法可以“标记”对象的属性,使它们在反射中“突出”? 例如: class A { int aa, b; string s1, s2; public int AA
我是一名优秀的程序员,十分优秀!