使用没有明确高度和宽度值的wpf文本框时,以及有可用于展开的空间时,文本框会在您键入时调整大小。
但是,当我更改边框粗细时,它不会重新计算边框厚度,对于非常粗的边框,部分文本会被边框覆盖。我如何明确地促成recalc?
巧合的是,我使用派生的自定义文本框类,所以我应该知道边框厚度何时发生变化。
答案 0 :(得分:2)
这个bug必须是一些优化出错
BorderThickness
的元数据或添加影响度量,排列或渲染的依赖项属性无效似乎仅在Text
,Width
,Height
或可用空间更改后重新计算尺寸。我用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的默认模板替换为您自己的(正确)版本。