【问题标题】:Highlight search term in textblock在文本块中突出显示搜索词
【发布时间】:2012-01-03 20:39:24
【问题描述】:

我在 silverlight 应用程序上有一个搜索文本框,用户在其中输入搜索词,结果显示在文本块中,要求搜索词匹配应在文本块中突出显示。

我已经看到了一些在文本块中突出显示搜索词的示例,但没有使用 mvvm 模式。我在viewmodel中绑定了textblock的text属性,我试图访问内联集合来指定不同的标签,但后来才知道内联集合是不可绑定的。

<TextBlock Text="{Binding Description}"/>

此描述正在 ViewModel 中设置

【问题讨论】:

  • 您能描述一下非 MVVM 解决方案吗?
  • MVVM表示VM与业务有关,View与显示有关。您可以随意在视图的代码隐藏中处理这个问题,或者创建一个 UserControl 来处理它。

标签: silverlight xaml mvvm textblock


【解决方案1】:

正如 Will 提到的,这是 View 功能,因此将其放在 Views 代码后面是可以接受的。

在您的 .xaml.cs 中

private void ButtonSearchRequest_Click(object sender, RoutedEventArgs e)
{
    Search(TextBoxToSearch, TextBoxSearchTerm.Text);
}

private void Search(TextBox tb, string strSearchTerm)
{
    strSearchTerm = strSearchTerm.Trim().ToLower();
    int iNextMatch = tb.Text.ToLower().IndexOf(strSearchTerm);

    if (iNextMatch >= 0)
    {
        tb.Focus();
        tb.CaretIndex = iNextMatch;
        tb.Select(iNextMatch, strSearchTerm.Length);
        tb.ScrollToLine(tb.GetLineIndexFromCharacterIndex(iNextMatch));
    }
 }

【讨论】:

  • 谢谢大家...但是后面的代码永远不会在我的组织中通过代码审查。我需要一种方法来动态生成内联集合并将其绑定到具有所需文本格式的文本块。我也可以考虑Richtextbox 的解决方案。
【解决方案2】:

好的,我想出了如何在 MVVM 中做到这一点。

  1. 我使用 Telerik 的 RadRichTextBox 控件来完成任务。

  2. 我创建了一个新类,其依赖属性为bindableXaml & 将字符串转换为 XAML 的方法(在代码中创建了新的RadRichTextBox 以在此进行突出显示工作并返回结果为radDocument

  3. 将其附加到RadRichTextBox,因此在ViewModel 中,来自DB 的字符串通过StringToXaml 方法转换为所需的XAML 格式。您可以使用 RichTextBox 获得相同的结果,但在其中创建的 XAML 将需要 StringBuilderRegEx.Match() 来完成突出显示工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2017-01-23
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多