【问题标题】:In a TextBlock, is it possible to select a specific word by touching it?在 TextBlock 中,是否可以通过触摸来选择特定的单词?
【发布时间】:2012-02-13 06:04:28
【问题描述】:

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

有人有想法吗?

我已尝试使用只读文本框。但是我需要点击它 3 次才能选择其中的一个单词,而我无法使用复制和粘贴功能。

提前致谢。

【问题讨论】:

    标签: c# silverlight windows-phone-7 windows-phone-7.1


    【解决方案1】:

    简单的回答:你不能

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

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

    转到here 以获取"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); 
    }
    

    Source 用于 GotFocus 功能。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • +1 我不知道可以获取光标的索引。
      • SelectionStart 属性??我可能是错的,就像我说我从来没有坐下来赢得 7 编程,对此一无所知。
      • SelectionStart 之类的东西适用于 TextBox。我使用 TextBlock 来显示文本,它们没有这样的属性。
      • 你能不能不使用文本框并将其属性更改为像文本块一样?假设这些是:BorderThickness:0,IsReadOnly:True,IsReadOnlyCaretVisible:True,光标:WPF 中的箭头 - 我不知道 win 7 中的等效属性。
      • 我已经尝试过重新设置样式的只读文本框,使其看起来像一个文本块。但是网格中带有只读文本框的焦点似乎效果不佳。
      【解决方案3】:

      由于此功能在文本框控件中可用,您能否在文本框中显示您的文本块内容,并重新设置它的样式以使其看起来像文本块 - 这样您应该获得复制功能。

      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 中编辑控件的样式,但原则上这将起作用。

      【讨论】:

        【解决方案4】:

        我认为点击是TextBox 的属性,而不是其中的文本。因此,如果您希望能够通过点击一个单词来选择它,我建议您为每个单词设置一个单独的文本框(如果您的应用程序允许的话)。如果你愿意,你可以让它看起来像一个单一的文本框。

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

        【讨论】:

        • 这可能是一个想法,但我认为大量 TextBlock 的性能会下降。我可以在单个滚动视图中拥有 10 个 TextBlock,每个 25 个单词...
        【解决方案5】:

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

        如果您想显示选定状态等,则必须通过视觉变换确定文本的位置,并在文本顶部绘制 Rect。

        【讨论】:

          猜你喜欢
          • 2018-06-24
          • 2020-10-06
          • 2022-11-21
          • 1970-01-01
          • 1970-01-01
          • 2019-03-30
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          相关资源
          最近更新 更多