Эта ошибка должна быть ошибочной оптимизацией
- Переопределение метаданных для
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;
}
}