【发布时间】:2012-02-13 06:04:28
【问题描述】:
在我的应用程序中,我有一个包含一些单词(如 20 或 25)的 TextBlock。我希望用户能够在 TextBlock 中点击一个单词并在应用程序中检索它以便之后使用它。
有人有想法吗?
我已尝试使用只读文本框。但是我需要点击它 3 次才能选择其中的一个单词,而我无法使用复制和粘贴功能。
提前致谢。
【问题讨论】:
标签: c# silverlight windows-phone-7 windows-phone-7.1
在我的应用程序中,我有一个包含一些单词(如 20 或 25)的 TextBlock。我希望用户能够在 TextBlock 中点击一个单词并在应用程序中检索它以便之后使用它。
有人有想法吗?
我已尝试使用只读文本框。但是我需要点击它 3 次才能选择其中的一个单词,而我无法使用复制和粘贴功能。
提前致谢。
【问题讨论】:
标签: c# silverlight windows-phone-7 windows-phone-7.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 功能。
【讨论】:
我对 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() 将您当前的坐标传递给它。 它将返回该坐标命中的 UIElement 列表。 为了确保 TB 在该列表中,您可能希望将 Rect 作为参数传递,在这种情况下,它将返回该 rect 命中的 UIElement 列表。
如果您想显示选定状态等,则必须通过视觉变换确定文本的位置,并在文本顶部绘制 Rect。
【讨论】: