WPF RibbonTextBox宽度问题

时间:2010-04-02 12:51:14

标签: wpf textbox width ribbon

在我看来,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行为?

4 个答案:

答案 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()事件。