Silverlight 4文本框不显示全部内容
问题描述:
有时,当我使用文本框时,无法一直向下滚动以查看最后一个单词。Silverlight 4文本框不显示全部内容
我已经包含一个具有相同内容但宽度不同的三个文本框的示例。左边的一个不显示所有的单词。
选择它移动到文本框的末尾,然后按'ctrl'+'end'。当我为左侧的文本框('_tb1')执行此操作时,我看不到光标,也看不到最后一个单词。看起来光标和文字在文本框的“下方”。我可以标记并复制未显示的文字。最后一个字应该是“si +”,见下面的代码。我已验证文本框的“文本”属性包含所有文本。
迄今为止,只有当我使用'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>
代码隐藏
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没有要绑定的文本属性或最大长度属性。我通过继承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;
}
答
哇,这真是一个错误!看来问题出在TextBoxView内部控件上。它在某些情况下不能正确计算文本。您可以使用Silverlight Spy查看问题的实际来源。
我试图很难找到问题的解决方法,但找不到一个。我试着用模板搞乱,没有任何工作100%的时间。
我们应该将此问题报告给Microsoft。
我相信这家伙有同样的问题:https://connect.microsoft.com/VisualStudio/feedback/details/549531/silverlight4-textbox-show-multiple-line-text-wrong 我虽然无法重现他的错误,但我使用XP和他的Windows 7. – 2011-01-25 09:38:06