1

我正在尝试在我的 Windows 商店应用程序中创建“查找/查找下一个”功能。我要搜索和选择的单词位于名为“tboxFind”的文本框中。文本框“EditorWindow”包含我的所有文本。

仅当“editorWindow”中有一行文本时,我的功能才有效。否则,选择将向前移动新行数。

如何解决?

有没有简单的方法来创建查找下一个功能?

private void btnFind_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    if ((tmpPos) == pos && tmpWord == tboxFind.Text && !String.IsNullOrEmpty(editorWindow.Text))
    {
        string tmpString = editorWindow.Text.Substring(pos + tboxFind.Text.Length);
        tmpPos = tmpString.ToLower().IndexOf(tboxFind.Text.ToLower());
        if (tmpPos != -1)
        {

            editorWindow.Focus(Windows.UI.Xaml.FocusState.Keyboard);
            editorWindow.SelectionStart = pos + tmpPos + tboxFind.Text.Length;
            editorWindow.SelectionLength = tboxFind.Text.Length;
            pos = pos + tmpPos + tboxFind.Text.Length; 
        }
    }
    tmpWord = tboxFind.Text;
    tmpPos = pos;
}

// 编辑:我找到了另一种创建该函数的方法。这是我的代码:

private void btnFind_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        numOfNewLines = 0;


            pos = (tmpWord == tboxFind.Text) ? editorWindow.Text.ToLower().IndexOf(tboxFind.Text, pos + tboxFind.Text.Length) 
                                             : editorWindow.Text.ToLower().IndexOf(tboxFind.Text);
            if (pos != -1)
            {
                foreach (char s in editorWindow.Text.Substring(0, pos))
                {
                    if (s == '\n')
                    {
                        numOfNewLines++;
                    }
                }
                pos -= numOfNewLines;
                editorWindow.Focus(Windows.UI.Xaml.FocusState.Keyboard);
                //tmpPos = editorWindow.Text.ToLower().IndexOf(tboxFind.Text);
                editorWindow.Select(pos, tboxFind.Text.Length);
                pos += numOfNewLines;

            }
            tmpWord = tboxFind.Text;
    }
4

1 回答 1

0

我不能 100% 确定您的代码有什么问题,因为我无法完全复制它,但请在基本的 Windows 应用程序中考虑以下 SSCCE:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnShown(EventArgs e)
    {
        base.OnShown(e);

        foreach (var i in FindIndicies("text"))
        {
            this.textBox1.SelectionStart = i;
            this.textBox1.SelectionLength = "text".Length;

            var result = MessageBox.Show(
                "Move to the next index?",
                "Next?",
                MessageBoxButtons.YesNo);
            if (result == System.Windows.Forms.DialogResult.No) { break; }
        }
    }

    private List<int> FindIndicies(string textToFind)
    {
        var indicies = new List<int>();
        var offset = 0;
        var i = 0;

        while ((i = this.textBox1.Text.IndexOf(
            textToFind,
            offset,
            StringComparison.CurrentCultureIgnoreCase)) > 0)
        {
            indicies.Add(i);
            offset = (i + textToFind.Length);
        }

        return indicies;
    }
}

给定textBox1具有以下设置的文本值:

Here is a set of text
and I'm going to find the word text

Even when there are multiple lines of text.

它正确地找到每个索引,并正确地选择它们。

我会考虑使用我编写的方法预先找到所有指标,然后根据需要简单地遍历它们。就我而言,我使用消息框来确定何时要移动到下一个索引,但您将使用不同的东西。

于 2013-09-09T15:17:40.587 回答