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

Silverlight 4文本框不显示所有内容,silverlight,silverlight-4.0,textbox,Silverlight,Silverlight 4.0,Textbox,有时,当我使用文本框时,不可能一直向下滚动以查看最后的单词 我已经包括了一个例子,其中有三个文本框,内容相同,但宽度不同。左边的那个并没有显示所有的单词 选择文本框,然后按“ctrl”+“end”,移动到文本框的末尾。当我对左边的文本框(“u tb1”)执行此操作时,我看不到光标,也看不到最后的单词。光标和文字似乎在文本框的“下方”。我可以标记并复制未显示的文本。最后一个单词应该是“si+”,请参见下面的代码。我已验证textbox的“Text”属性是否包含所有文本 到目前为止,只有在我使用“T

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

我已经包括了一个例子,其中有三个文本框,内容相同,但宽度不同。左边的那个并没有显示所有的单词

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

到目前为止,只有在我使用“TextWrapping=”Wrap”和某些宽度时才会发生这种情况

对如何修复它有什么建议吗

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


哇,这真是一只虫子!问题似乎在于TextBoxView内部控制。在某些情况下,它无法正确计算文本。您可以使用Silverlight Spy查看问题的实际来源

我努力寻找解决这个问题的办法,但没有找到。我试着在模板上乱搞,但没有任何东西能100%正常工作


我们应该向微软报告这个问题。

所以我遇到了完全相同的问题。根据您的需求,这可以通过使用RichTextBox来解决。作为一个奖励,它看起来好像你得到更快的滚动

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

如果您连接到事件内容已更改

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

private void HandleContentChanged(object sender, ContentChangedEventArgs e)
{
    var text = GetContent(out blocks);
    Text = text;
}
并添加要绑定到的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;
    }
公共字符串GetContent(out int块)
{
var builder=新的StringBuilder();
块=0;
foreach(var在Blocks.OfType()中运行。选择(段落=>段落.Inlines.FirstOrDefault())。OfType()
{
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);
返回内容??字符串。空;
}

我相信这家伙也遇到了同样的问题:虽然我无法重现他的错误,但我使用的是XP和Windows 7。+1感谢您在connect.microsoft.com上找到这个条目。在我这方面,我可以用WindowsServer2003R2复制它。
    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;
    }