2010-04-02 10 views
1

Il me semble que le contrôle du ruban a un problème avec les zones de texte. Je m'attendais à un comportement de contrôle TextBox commun: une largeur fixe et un curseur visible lorsque le texte dépasse la largeur. Mais le contrôle RibbonTextBox change sa largeur et lorsque le texte dépasse la limite de droite, le débordement n'est pas visible.WPF RibbonTextBox Problème de largeur

J'ai trouvé un hack sur un blog qui fait quelque chose comme ceci:

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); 
} 

mais je reallly ne veux pas faire une telle solution de contournement. Existe-t-il un autre moyen plus simple d'obtenir un comportement TextBox simple?

Répondre

1

Apparemment, le RibbonTextBox n'est pas un simple TextBox; c'est en fait un panneau de pile avec: image + label + border. En fait, son modèle a ce contenu:

<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> 

Ainsi, lorsque vous définissez la largeur d'un RibbonTextBox, vous ne définissez pas réellement la largeur de la zone de texte, mais la largeur de l'ensemble du contrôle.

Ma suggestion serait de créer une classe dérivée de RibbonTextBox et implémenter dans cette classe le gestionnaire d'événements Loaded comme l'exemple que vous avez donné dans votre article. Mais gardez à l'esprit que l'image, l'étiquette et la bordure ont une marge supplémentaire et un rembourrage qui vous donnera plus d'espace sur la gauche de la zone de texte.

1

Vous pouvez définir la largeur comme ceci:

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

10

Il existe une propriété « TextBoxWidth » qui ne figure pas dans le concepteur, mais peut aussi être utilisé en XAML:

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

C'est la bonne réponse. –

-1

Le problème avec RibbonTextBox est que l'événement KeyDown et KeyUp ne sont pas déclenchés lorsque vous appuyez sur la touche "Entrée". Par conséquent, l'événement LostFocus() n'est pas déclenché lorsque vous appuyez sur la touche "Entrée".