2010-12-06 54 views
12

J'ai besoin d'une bonne solution pour faire un TextBox dans une grille pour étendre à son espace disponible, mais ne pas se développer en fonction de la longueur du texte qu'il contient.WPF: Développez TextBox par largeur disponible mais PAS par son contenu?

La plupart des solutions que j'ai trouvé est de faire une fausse-frontière et de lier à son ActualWidth mais c'est une solution hacky pour moi. La solution frontière a besoin d'une petite marge sur la frontière, ce qui n'est pas du tout sympa. Si vous le réglez sur Low, l'interface utilisateur se comportera de manière très étrange. Je n'aime pas cette solution. Il doit y avoir un meilleur? Tout ce que je veux, c'est que la zone de texte ne se développe pas avec son contenu. Cela ne devrait pas être si difficile. S'il vous plait, faites moi savoir comment faire ça.

EDIT:

Une chose étrange, j'ai remarqué est que le code suivant rend la frontière beaucoup plus grande, alors il doit être:

<Grid> 
    <Border Name="dummy1" Background="Red" /> 
    <TextBox Text="23242342343555554234234444444444423423423432344444444" Width="{Binding ActualWidth, ElementName=dummy1}" /> 
</Grid> 

Remplacement de l'ordre à la frontière et zone de texte fait la frontière s'adapter à la boîte de texte bien, mais ce dont j'ai besoin est le contraire. Comme dit précédemment, mettre une marge (sur la frontière) à au moins 0,5 le fait fonctionner mais avec une interface utilisateur légèrement twitchy en conséquence.

+1

Si vous avez juste un TextBox dans une grille, il doit s'étendre par défaut à son parent. Êtes-vous sûr de n'avoir rien qui modifie votre propriété HorizontalAlignment? Parlez-vous du contrôle Grid ou d'un autre contrôle (comme DataGrid ou GridView) que vous appelez Grid? –

Répondre

2

HorizontalAlignment = L'étirement n'aide pas? Les panneaux de quadrillage AFAIK étendent leurs éléments enfants à l'espace disponible dans leur cellule lorsque leur alignement horizontal est défini sur Étirement.

+0

Oui mais ma grille n'a pas de taille explicite, ses cellules devraient s'étendre à son contenu. Le problème est que le contrôle de textbox s'étend aussi à son contenu ... Pour mon scénario c'est ok si un combobox développe son contenu mais pas pour un textbox pour faire de même. Il agrandit la grille et ma fenêtre aussi parce que Im using SizeToContent = WidthAndHeight. –

+0

Vous voulez donc que votre zone de texte ait une largeur fixe? Est-ce connu au moment de la compilation? – Alex

+0

Eh bien, non. Il devrait remplir tout l'espace donne dans la cellule mais ne jamais développer avec son contenu textuel. –

1

Avez-vous découvert comment résoudre ce problème?

Réponse à votre problème de bordure: Vous devriez placer votre TextBox-Object dans la bordure.

<Border Background="Red" Padding="3"> 
     <Button Content="Button" /> 
    </Border> 
2

J'ai utilisé DockPanel pour étendre à son espace disponible. Vous devez également définir la marge:

<DockPanel> 
    <TextBox Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DockPanel}, Path=ActualWidth}" Margin="1" /> 
</DockPanel>