WPF TextBox重新计算大小

时间:2011-03-05 20:07:08

标签: wpf wpf-controls

使用没有明确高度和宽度值的wpf文本框时,以及有可用于展开的空间时,文本框会在您键入时调整大小。

但是,当我更改边框粗细时,它不会重新计算边框厚度,对于非常粗的边框,部分文本会被边框覆盖。我如何明确地促成recalc?

巧合的是,我使用派生的自定义文本框类,所以我应该知道边框厚度何时发生变化。

enter image description here

2 个答案:

答案 0 :(得分:2)

这个bug必须是一些优化出错

  • 覆盖BorderThickness的元数据或添加影响度量,排列或渲染的依赖项属性无效
  • 从父容器中取消和重锁没有任何影响
  • 如果在新容器中给出的空间与旧容器中的空间完全相同,即使从父容器中取消并重新插入新容器也无济于事

似乎仅在TextWidthHeight或可用空间更改后重新计算尺寸。我用Reflector环顾四周,但事情变得相当复杂,所以我找不到这个来源。

这是一个小型解决方法,可以监听BorderThickness中的更改,并在已更改的事件处理程序中对Width进行少量更改,一旦更新,请立即更改

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
        DependencyPropertyDescriptor borderThickness
            = DependencyPropertyDescriptor.FromProperty(MyTextBox.BorderThicknessProperty, typeof(MyTextBox));
        borderThickness.AddValueChanged(this, OnBorderThicknessChanged);
    }
    void OnBorderThicknessChanged(object sender, EventArgs e)
    {
        double width = this.Width;
        SizeChangedEventHandler eventHandler = null;
        eventHandler = new SizeChangedEventHandler(delegate
        {
            this.Width = width;
            this.SizeChanged -= eventHandler;
        });
        this.SizeChanged += eventHandler;
        this.Width = this.ActualWidth + 0.00000001;
    }
}

答案 1 :(得分:1)

首先,这看起来像个错误。

如果问题是没有考虑边框粗细的动态更改,您可以通过在FrameworkPropertyMetadata中使用AffectsMeasure创建依赖项属性并将其绑定到边框来进行解决方法厚度。希望这个怪癖有所帮助。

如果不考虑边框粗细的静态设置,您可以尝试将TextBox的默认模板替换为您自己的(正确)版本。