如何从silverlight中的不可编辑文本框中为wp7获取所选文本

时间:2011-01-20 04:31:16

标签: c# silverlight windows-phone-7

我想要一个文本框,其中包含用户可以选择但不能编辑的文本,我想对该文本执行一些操作。

我创建了一个文本框并设置了IsReadOnly =“True”。当我点击一些文本时,我看到它被突出显示,但是当触发SelectionChanged事件时,textBox1.SelectedText为空。

当IsReadOnly =“False”时,它可以正常工作,但键盘弹出,我不想要。 有谁知道如何实现我想要的?任何帮助将不胜感激。

3 个答案:

答案 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>