在文本块中,是否可以通过触摸来选择特定的单词

本文关键字:选择 单词 触摸 可以通过 文本 是否 | 更新日期: 2023-09-27 18:20:34

在我的应用程序中,我有一个包含一些单词(如20或25)的TextBlock。我希望用户能够点击TextBlock中的一个单词,并在应用程序中检索它以使用它。

有人有主意吗?

我尝试过只读文本框。但我需要点击它3次来选择其中的一个单词,我不能对副本无所事事;粘贴功能。

提前谢谢。

在文本块中,是否可以通过触摸来选择特定的单词

简单答案:你不能

解决方法:使用重新样式的TextBox,使其看起来像TextBlock

TextBox box= new TextBox();
box.Style = (Style)App.Current.Resources["CopyTextBlock"];

转到此处查看"CopyTextBlock"样式。

和过载GotFocus:

box.GotFocus += textBox_GotFocus;

带有:

private void textBox_GotFocus(object sender, RoutedEventArgs e)
{
    TextBox txtBox = (TextBox)sender;
    char[] strDataAsChars = txtBox.Text.ToCharArray();
    int i = 0;
    for (i = txtBox.SelectionStart - 1; ((i >= 0) && (strDataAsChars[i] != ' ')); --i) ;
    int selBegin = i + 1;
    for (i = txtBox.SelectionStart; ((i < strDataAsChars.Length) && (strDataAsChars[i] != ' ')); ++i) ;
    int selEnd = i;
    txtBox.Select(selBegin, selEnd - selBegin);
    Console.WriteLine("'n" + txtBox.SelectedText); 
}

GotFocus函数的源。

我对win 7编程没有任何具体的了解,但在WPF/winforms中,当文本框获得焦点时,我会捕捉光标的索引/位置,然后找到开始/结束/围绕该位置的单词,并选择该单词??很抱歉,如果这无关紧要,我只是想分享一下。

由于此功能在文本框控件中可用,您是否可以在文本框中显示文本块内容,并将其重新设置为类似文本块的样式-这样您就可以获得复制功能。

XAML Xnippet

<TextBox 
    Text="I am a textbox and my content is selectable" 
    TextWrapping="Wrap" 
    Width="400" 
    Height="100" 
    IsReadOnly="True" 
    Background="{StaticResource PhoneBackgroundBrush}" 
    Foreground="{StaticResource PhoneForegroundBrush}" />

似乎是解决方案的一部分。当控件处于活动状态时,您需要在VisualState中编辑控件的样式,但原则上这是可行的。

我认为敲击是TextBox的一个属性,而不是其中的文本。因此,如果你想通过敲击来选择一个单词,我建议你为每个单词都有一个单独的文本框(如果你的应用程序允许的话)。如果你想要的话,你可以把它做成一个单独的文本框。

如果事先不知道单词的数量,则可以在每次添加新单词时以编程方式添加一个文本框。您可以将所有文本框放在水平(或垂直,以适合您的为准)列表中。因此,如果文本过长,则可以滚动。

只需使用VisualTreeHelper.FindElementsInHostCoordinates()将当前坐标传递给它。它将返回被该坐标击中的UI元素列表。为了确保TB在该列表中,您可能希望将Rect作为参数传递,在这种情况下,它将返回该Rect命中的UIElements的列表。

如果你想显示选定的状态等等,你必须通过视觉转换来确定文本的位置,并在文本上绘制Rect。