Silverlight 4 文本框不显示所有内容

标签 silverlight silverlight-4.0 textbox

有时,当我使用文本框时,无法一直向下滚动以查看最后的单词。

我已经包含了一个包含三个文本框的示例,这些文本框具有相同的内容,但宽度不同。左边的没有显示所有单词。

通过选择文本框移动到文本框的末尾,然后按“ctrl”+“end”。当我对左侧的文本框('_tb1')执行此操作时,我看不到光标,也看不到最后一句话。似乎光标和单词在文本框的“下方”。我可以标记和复制未显示的文本。最后一个词应该是“si+”,见下面的代码。我已验证文本框的“文本”属性包含所有文本。

到目前为止,这只发生在我使用 'TextWrapping="Wrap"' 和某些宽度时。

关于如何修复它的任何建议?

Textbox to the left does not show last words

<UserControl x:Class="Silverlight4TextBoxProblem.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid Width="500" Height="150">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBox Name="_tb1" Grid.Column="0" TextWrapping="Wrap" 
                 FontFamily="Arial" FontSize="12"
                 VerticalScrollBarVisibility="Visible"
                 Width="100"/>
        <TextBox Name="_tb2" Grid.Column="1" TextWrapping="Wrap" 
                 FontFamily="Arial" FontSize="12" 
                 VerticalScrollBarVisibility="Visible"
                 Width="75"/>
        <TextBox Name="_tb3" Grid.Column="2" TextWrapping="Wrap" 
                 FontFamily="Arial" FontSize="12"
                 VerticalScrollBarVisibility="Visible"
                 Width="150"/>
        <Button Grid.Column="3" Click="ButtonClick" Content="Assert _tb1"/>
    </Grid>
</UserControl>

代码隐藏
public partial class MainPage : UserControl
{
    private readonly string ErrorText = @"Lorem ipsum dolor sit amet+++," + Environment.NewLine 
        + "consectetur adipisicing elit, sed do eiusmod" + Environment.NewLine
        + "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam," + Environment.NewLine
        + "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo" + Environment.NewLine
        + "consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse" + Environment.NewLine
        + "cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non" + Environment.NewLine
        + "proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem" + Environment.NewLine
        + "ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor" + Environment.NewLine
        + "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis" + Environment.NewLine
        + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." + Environment.NewLine
        + "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu" + Environment.NewLine
        + "fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in" + Environment.NewLine
        + "culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit" + Environment.NewLine
        + "amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore" + Environment.NewLine
        + "et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation" + Environment.NewLine
        + "ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor" + Environment.NewLine
        + "in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla" + Environment.NewLine
        + "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui" + Environment.NewLine
        + "officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet," + Environment.NewLine
        + "consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et" + Environment.NewLine
        + "dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco" + Environment.NewLine
        + "laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in" + Environment.NewLine
        + "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur." + Environment.NewLine
        + "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia" + Environment.NewLine
        + "deserunt mollit anim id est laborum. Lorem ipsum dolor si+";

    public MainPage()
    {
        InitializeComponent();

        _tb1.Text = ErrorText;
        _tb2.Text = ErrorText;
        _tb3.Text = ErrorText;
    }

    private void ButtonClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(_tb1.Text.Last().ToString());
    }
}

最佳答案

所以我有完全相同的问题。根据您的要求,这可以通过使用 RichTextBox 来解决。作为奖励,它看起来好像你的滚动速度更快。

但是,RTB 没有要绑定(bind)的文本属性或最大长度属性。我通过将 RTB 继承到我的 CustomTextBox 解决了这个问题。

如果你连接到事件 contentchanged

public class CustomTextBox : RichTextBox
{
    public CustomTextBox()
    {
        ContentChanged += HandleContentChanged;
    }
...

进而
private void HandleContentChanged(object sender, ContentChangedEventArgs e)
{
    var text = GetContent(out blocks);
    Text = text;
}

并添加要绑定(bind)的 TextProperty
public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(CustomTextBox), new PropertyMetadata(string.Empty, HandleTextChanged));

    private static void HandleTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var customTextBox = (CustomTextBox)d;

        var newValue = (string)e.NewValue;

        //This method is only run when set from codebehind
        UpdateOnTextChange(customTextBox, newValue);
    }

    private static void UpdateOnTextChange(CustomTextBox customTextBox, string newValue)
    {
        int blocks;

        if (customTextBox.GetContent(out blocks) != newValue)
        {
            var binding = customTextBox.GetBindingExpression(TextProperty);

            customTextBox.Blocks.Clear();
            var value = EnsureString(newValue);
            customTextBox.Selection.Text = value;

            if (customTextBox.HasTextChanges)
            {
                customTextBox.HasTextChanges = false;
                //reset binding... 
                if (binding != null)
                {
                    customTextBox.SetBinding(TextProperty, binding.ParentBinding);
                }
            }

            var bindingExpression = customTextBox.GetBindingExpression(TextProperty);

            if (bindingExpression != null)
                bindingExpression.UpdateSource();
        }
    }

并且由于您希望能够将 CustomTextBox 的内容作为字符串获取:
    public string GetContent(out int blocks)
    {
        var builder = new StringBuilder();
        blocks = 0;
        foreach (var run in Blocks.OfType<Paragraph>().Select(paragraph => paragraph.Inlines.FirstOrDefault()).OfType<Run>())
        {
            blocks++;
            builder.Append(run.Text);
            builder.Append(Environment.NewLine);
        }
        var content = builder.ToString();
        if (content.EndsWith(Environment.NewLine, StringComparison.CurrentCulture))
            content = content.Substring(0, content.Length - 2);
        return content ?? string.Empty;
    }

关于Silverlight 4 文本框不显示所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4781243/

相关文章:

silverlight - 将组合框上的选定值绑定(bind)到 View 模型

silverlight - 如何从 Silverlight 4 中的 DataForm.Validating() 事件中删除一个或多个字段?

mvvm - 命令是否仅适用于 Silverlight 中的按钮?

silverlight - 隔离存储可用空间等于0

c# - 如何在 Silverlight/WP7 中隐藏按钮?

silverlight - 在哪里可以找到好的 Silverlight 应用程序 XAML 模板和主题?

silverlight - 在 HTML 5 和 Silverlight 4 之间拖放

c# - TextBox.AppendText() 不自动滚动

asp.net - 如何获取动态创建的文本框的文本值

c# - 将所选行从 ListView 显示到文本框?