在Windows应用商店应用中查找下一个功能

时间:2013-09-09 14:32:36

标签: c# .net

我正在尝试在我的Windows应用商店中制作“查找/查找下一个”功能。 我想要搜索和选择的单词位于名为“tboxFind”的textBox中。 文本框'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;
    }

1 个答案:

答案 0 :(得分: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.

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

我会考虑使用我编写的方法预先查找所有指标,然后根据需要简单地迭代它们。在我的情况下,我正在使用一个消息框来确定我何时想要移动到下一个索引,但你会使用不同的东西。