2011-03-05 37 views
3

當使用沒有明確高度和寬度值的wpf文本框,並且有可用空間展開時,文本框會在鍵入時調整大小。WPF TextBox重新計算大小

但是,當我改變邊框厚度時,它不會重新計算它,對於非常厚的邊框,部分文本被邊框覆蓋。我如何明確沉澱重新計算?

巧合的是我使用派生的自定義文本框類,所以我應該知道邊界厚度的變化。

enter image description here

回答

2

此錯誤,必須進行一些優化出了錯

  • 重寫元數據BorderThickness或添加一個依賴屬性,影響措施,安排或渲染不利於
  • 脫位和Redocking從父容器沒有效果要麼
  • 即使從父容器和重新鎖定到新容器的解除鎖定也無濟於事,只要它在新容器中給出的空間與它在舊容器中的空間完全相同即可

看起來大小似乎只是重新計算一次Text,Width,Height或可用空間的變化。我用反射器環顧四周,但事情變得非常複雜,所以我找不到這個來源。

這裏是一個小的變通方法,聽在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

首先,這看起來像一個bug。

如果問題在於不考慮邊界厚度的動態變化,則可以通過創建AffectsMeasure的依賴項屬性在FrameworkPropertyMetadata中進行解決,並將其綁定到邊框厚度。希望這個怪癖有幫助。

如果不考慮邊框厚度的靜態設置,則可以嘗試用您自己的(正確)版本替換TextBox的默認模板。

+0

AffectsMeasure沒有幫助。如果我在改變厚度後開始打字,事情就會重新調整,所以它也不是一個靜態問題。 – NVM 2011-03-05 20:57:48

+0

我確定它是一個bug,但它在凌晨2:30在這裏我需要一個真正的快速修復,不管它有多髒。 :D – NVM 2011-03-05 20:59:05

+0

@NVM:在這種情況下,可能只是將邊框包含爲外部控件?必須足夠快速和骯髒:-) – Vlad 2011-03-05 23:12:15