2011-01-24 48 views
4

有时,当我使用文本框时,无法一直向下滚动以查看最后一个单词。Silverlight 4文本框不显示全部内容

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

选择它移动到文本框的末尾,然后按'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()); 
    } 
} 

回答

1

所以我拥有完全相同的标志。根据你的要求,这可以通过使用RichTextBox来解决。作为奖励,它看起来好像你得到更快的滚动。

但是,RTB没有要绑定的文本属性或最大长度属性。我通过继承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; 
} 

,并添加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; 
    } 
1

哇,这真是一个错误!看来问题出在TextBoxView内部控件上。它在某些情况下不能正确计算文本。您可以使用Silverlight Spy查看问题的实际来源。

我试图很难找到问题的解决方法,但找不到一个。我试着用模板搞乱,没有任何工作100%的时间。

我们应该将此问题报告给Microsoft。

+1

我相信这家伙有同样的问题:https://connect.microsoft.com/VisualStudio/feedback/details/549531/silverlight4-textbox-show-multiple-line-text-wrong 我虽然无法重现他的错误,但我使用XP和他的Windows 7. – 2011-01-25 09:38:06