WPF TextBox пересчитать размер - PullRequest
3 голосов
/ 05 марта 2011

При использовании текстового поля wpf без явных значений высоты и ширины, а также при наличии свободного пространства для расширения текстовое поле изменяется по мере ввода.

Однако, когда я изменяю толщину границы, она не пересчитывает ее, и для очень толстых границ часть текста закрывается границей. Как я могу явно ускорить повторный вызов?

По совпадению я использую производный пользовательский класс текстового поля, поэтому я должен знать, когда изменяется толщина границы.

enter image description here

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

Эта ошибка должна быть ошибочной оптимизацией

  • Переопределение метаданных для 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 голос
/ 05 марта 2011

Прежде всего, это выглядит как ошибка.

Если проблема в том, что динамические изменения толщины границы не учитываются, возможно, вы можете обойти эту проблему, создав свойство зависимости с помощью AffectsMeasure в FrameworkPropertyMetadata и привязать его к толщине границы.Надеюсь, что это поможет.

Если статические настройки толщины границы не приняты во внимание, вы можете попытаться заменить шаблон TextBox по умолчанию своей собственной (правильной) версией.

...