2

我正在尝试将 SelectionStart 和 SelectionLength 属性用于文本框。它没有任何效果,但也没有错误。它实际上是后台工作程序 ProgressChanged 方法的一部分,但我已经在测试解决方案中单独尝试了 SelectionStart 和 SelectionLength 并且它是相同的......没有任何反应......

有任何想法吗?谢谢!!!

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{
    // Update the GUI as the music is playing
    textBox1.SelectionStart = ((int)e.UserState);
    textBox1.SelectionLength = (1);
}
4

2 回答 2

5

你的代码对我来说很好用(我假设你的 BGW 已经启动并且你ReportProgress当然在打电话)。

我的猜测是您的代码也适用于您,但也许您的 TextBox 没有焦点,因此您看不到所选文本。

如果这是您的问题,请将 TextBox 的HideSelection属性设置为 false。这将允许 TextBox 的选定文本显示选定(突出显示),即使 TextBox 没有焦点。

您还可以查询 TextBox 的SelectedText 属性以获取控件的选定文本,即使它没有显示为这样。

于 2012-06-21T20:08:28.930 回答
1

确保如果您在创建对象的同一线程(GuiThread)上运行此代码。后台工作人员可能创建文本框的线程不同。您可以通过在控件上调用 Invoke 来确保您使用的是 GuiThread(您可以使用“this”来引用它)。

所以..做类似的事情

this.Invoke()。

您需要向它传递一个委托,因此将您的文本框选择逻辑移动到一个单独的方法中,然后将该方法传递给 Invoke() 调用。

编辑:

您的代码可能看起来像这样:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.Invoke(new Action<TextBox, int, int>(UpdateTextboxSelection), new object[] { textBox1, (int)e.UserState, 1 });
}

private void UpdateTextboxSelection(TextBox t, int start, int length)
{
    t.SelectionStart = start;
    t.SelectionLength = length;
    t.Focus(); // to make sure the box is in focus so that you see the selection
}

编辑 2:注意,我实际上并没有尝试查看这是否有效,这只是一个常见问题,当我想知道为什么某些 UI 的东西没有做任何事情时,我一直有这个问题,我注意到我在不同的线程上运行,什么时候我开始使用它工作的 GUI 线程。

编辑3:我刚刚进行了测试。完成后,请确保在文本框上使用 Focus()。可能正在按您的意图设置文本选择,但您看不到它,因为框不在焦点上。

于 2012-06-21T19:55:35.153 回答