2010-04-02 102 views
1

在我看來,Ribbon控件在文本框中存在問題。我期待着一個普通的TextBox控件行爲:當文本超出寬度時,固定寬度和可見插入符。但是,RibbonTextBox控件更改其寬度,當文本超出正確的限制時,溢出不可見。WPF RibbonTextBox寬度問題

我發現了一個博客,的確是這樣的一個黑客:

var img = SearchButton.Template.FindName("image", SearchButton); 
if (img != null && img is Image) 
    (img as Image).Visibility = Visibility.Collapsed; 
var lbl = FindTemplateControl<Label>(SearchText); 

var border = SearchText.Template.FindName("Bd", SearchText); 

if (border != null && border is Border && img != null && lbl != null) 
{ 
    (border as Border).Width = SearchText.ActualWidth - (((Image)img).ActualWidth + lbl.ActualWidth); 
} 

但我reallly不想做這樣的解決方法。有沒有其他更簡單的方法來實現簡單的TextBox行爲?

回答

1

顯然,RibbonTextBox不是一個簡單的TextBox;它實際上是一個帶有: 圖像+標籤+邊框的堆疊面板。其實,它的模板有這樣的內容:

<RibbonTextBox> 
    <StackPanel> 
     <Image/> 
     <Label> 
      <Border> 
       <ContentPresenter> 
        <TextBlock/> 
       </ContentPresenter> 
      </Border> 
     </Label> 
     <Border> 
      <ScrollViewer> 
       <Grid> 
        <Rectangle> 
        </Rectangle> 
        <ScrollContentPresenter> 
         <TextBoxView> 
          <DrawingVisual/> 
         </TextBoxView> 
         <AdornerLayer/> 
        </ScrollContentPresenter> 
        <ScrollBar/> 
        <ScrollBar/> 
       </Grid> 
      </ScrollViewer> 
     </Border> 
    </StackPanel> 
</RibbonTextBox> 

所以,當你設置RibbonTextBox的寬度,你實際上並沒有設置文本框的寬度,而是整個控件的寬度。

我的建議是創建一個派生自RibbonTextBox的類,並在該類中實現Loaded事件處理程序,就像您在帖子中給出的示例一樣。但請記住,圖像,標籤和邊框有額外的邊距和填充,這將爲您在文本框左側留出額外的空間。

1

可以這樣設置寬度:

var textBox = new RibbonTextBox() { Label = "Label", Text = "Text", TextBoxWidth = 150 };

10

有一個屬性「TextBoxWidth」,這是不是在設計師的顯示,但也可以用在XAML:

<ribbon:RibbonTextBox Label="abc" TextBoxWidth="300" /> 
+1

這是正確的答案。 – 2015-03-03 22:45:10

-1

的RibbonTextBox的問題在於,當您按下「Enter」鍵時,KeyDown和KeyUp事件不會被觸發。因此,按「Enter」鍵時,不會觸發LostFocus()事件。