我想要一个文本框,其中包含用户可以选择但不能编辑的文本,我想对该文本执行一些操作。
我创建了一个文本框并设置了IsReadOnly =“True”。当我点击一些文本时,我看到它被突出显示,但是当触发SelectionChanged事件时,textBox1.SelectedText为空。
当IsReadOnly =“False”时,它可以正常工作,但键盘弹出,我不想要。 有谁知道如何实现我想要的?任何帮助将不胜感激。
答案 0 :(得分:2)
我自己尝试过(并确认了你所看到的)我个人会说这是一个错误,在这种情况下你应该在App Hub forums上报告。 TextBox.IsReadOnly
属性的文档说明:“如果文本框是只读的,则不允许用户输入或编辑,但可以进行编程更改。用户仍然可以选择文本,光标仍然会出现。 KeyUp和KeyDown事件被标记为已处理。“但我不明白为什么你不能得到SelectedText(或SelectionStart和SelectionLength,对于只读的TextBox也是0)。
就解决方法而言,我认为您需要创建一个自定义TextBox模板,该模板不提供可编辑的界面,同时仍然支持选择,而不是将IsReadOnly设置为false,以便SelectedText,SelectionStart和SelectionLength属性仍然有效。虽然可能是一个很高的命令。
答案 1 :(得分:1)
如果只读取TextBox的Text属性,则必须将其设置为属性。像这样的TextBoxName.Attributes.Add(“value”,“SomeText”);
答案 2 :(得分:1)
我遇到完全相同的问题,只要SelectionChanged事件触发我的ReadOnly文本框就会报告.SelectionStart& .SelectionLength为0。
跟随Derek关于模板的建议,我已经围绕文本框的默认控件模板进行了研究。问题的根源似乎是模板内部使用了两个不同的xaml元素,一个是read-write&另一个只读。我怀疑发生的事情是只读元素,当被IsReadOnly = True显示时,会触发SelectionChanged事件,但文本框选择属性只会报告读写元素的选择状态。
我已经删除了一个只有一个内容呈现器的精简控制模板,并根据视觉状态消除了控件的任何样式,这样可以解决这个问题。即使IsReadOnly设置为True报告.SelectionStart& .SelectionLength正确。
您可以通过样式化或直接设置文本框的.Template属性来应用它。
<ControlTemplate TargetType="TextBox">
<Grid
Margin="{TemplateBinding Margin}"
Background="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver"/>
<VisualState x:Name="Disabled" />
<VisualState x:Name="ReadOnly" />
</VisualStateGroup>
<VisualStateGroup x:Name="FocusStates">
<VisualState x:Name="Focused"/>
<VisualState x:Name="Unfocused"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border
Background="{TemplateBinding Background}"
Margin="0">
<ContentControl
x:Name="ContentElement"
BorderThickness="0"
Margin="{StaticResource PhoneTextBoxInnerMargin}"
Padding="{TemplateBinding Padding}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
Foreground="{TemplateBinding Foreground}"/>
</Border>
</Grid>
</ControlTemplate>