在我看来,Ribbon控件的文本框有问题。我期待一个常见的TextBox控件行为:当文本超出宽度时,固定宽度和可见插入符号。但是RibbonTextBox控件会更改其宽度,当文本超出正确限制时,溢出不可见。
我在博客上发现了一个类似的东西:
var img = SearchButton.Template.FindName("image", SearchButton);
if (img != null && img is Image)
(img as Image).Visibility = Visibility.Collapsed;
var lbl = FindTemplateControl<Label>(SearchText);
var border = SearchText.Template.FindName("Bd", SearchText);
if (border != null && border is Border && img != null && lbl != null)
{
(border as Border).Width = SearchText.ActualWidth - (((Image)img).ActualWidth + lbl.ActualWidth);
}
但我真的不想做这样的解决方法。有没有其他更简单的方法来实现简单的TextBox行为?
答案 0 :(得分:10)
有一个属性“TextBoxWidth”未在设计器中显示,但也可以在XAML中使用:
<ribbon:RibbonTextBox Label="abc" TextBoxWidth="300" />
答案 1 :(得分:1)
显然,RibbonTextBox不是一个简单的TextBox;它实际上是一个堆栈面板: 图像+标签+边框。实际上,它的模板有这样的内容:
<RibbonTextBox>
<StackPanel>
<Image/>
<Label>
<Border>
<ContentPresenter>
<TextBlock/>
</ContentPresenter>
</Border>
</Label>
<Border>
<ScrollViewer>
<Grid>
<Rectangle>
</Rectangle>
<ScrollContentPresenter>
<TextBoxView>
<DrawingVisual/>
</TextBoxView>
<AdornerLayer/>
</ScrollContentPresenter>
<ScrollBar/>
<ScrollBar/>
</Grid>
</ScrollViewer>
</Border>
</StackPanel>
</RibbonTextBox>
因此,当您设置RibbonTextBox的宽度时,实际上并未设置文本框的宽度,而是设置整个控件的宽度。
我的建议是创建一个派生自RibbonTextBox的类,并在此类中实现Loaded事件处理程序,就像您在帖子中提供的示例一样。但请记住,图像,标签和边框有额外的边距和填充,这将为您提供文本框左侧的额外空间。
答案 2 :(得分:1)
您可以像这样设置宽度:
var textBox = new RibbonTextBox() { Label = "Label", Text = "Text", TextBoxWidth = 150 };
答案 3 :(得分:-1)
RibbonTextBox的问题是按“Enter”键时不会触发KeyDown和KeyUp事件。因此,当您按“回车”键时,不会触发LostFocus()
事件。