2008-11-11 15 views
81

Dies scheint wie es sollte einfach sein, aber ich bin ratlos. In WPF möchte ich eine TextBox, die sich auf die Breite des übergeordneten Elements erstreckt, aber nur auf eine maximale Breite. Das Problem ist, dass ich möchte, dass es innerhalb seines Elternteils gerechtfertigt ist. Um es zu dehnen, müssen Sie HorizontalAlignment = "Stretch" verwenden, aber dann wird das Ergebnis zentriert. Ich habe mit HorizontalContentAlignment experimentiert, aber es scheint nichts zu tun.HorizontalAlignment = Stretch, MaxWidth und Links gleichzeitig ausgerichtet?

Wie bekomme ich diese blaue Textbox, um mit der Größe des Fensters zu wachsen, eine maximale Breite von 200 Pixeln zu haben und linksbündig zu sein?

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
    <TextBox Background="Azure" Text="Hello" HorizontalAlignment="Stretch" MaxWidth="200" /> 
    </StackPanel> 
</Page> 

Was ist der Trick?

+0

Bitte nachschauen würde [ "Should Fragen umfassen‚Tags‘im Titel?"] (http://meta.stackexchange.com/questions/19190/should- Questi ons-include-tags-in-ihrem-titel), wobei der Konsens "nein, sie sollten nicht" lautet! * Ja, ich weiß ... nur aus Legacy-Gründen:) * –

Antwort

81

Sie HorizontalAlignment nach links einstellen können, stellen Sie Ihren MaxWidth und binden Width dann an die ActualWidth des übergeordneten Elements:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Name="Container"> 
    <TextBox Background="Azure" 
    Width="{Binding ElementName=Container,Path=ActualWidth}" 
    Text="Hello" HorizontalAlignment="Left" MaxWidth="200" /> 
    </StackPanel> 
</Page> 
+7

Autoresize nicht .. Scheint, zum Inhalt passend zu sein .. vermisse ich etwas? – Gishu

+0

Dies scheint meinen silverlight player – resopollution

+2

@Gishu zum Absturz zu bringen, stelle sicher, dass du 'HorizontalAlignment =" Stretch "' auf dem 'Container' Element gesetzt hast. (p.s., ich weiß, dass du diese Frage vor mehr als 6 Jahren gestellt hast.) –

41
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" MaxWidth="200"/> 
    </Grid.ColumnDefinitions> 

    <TextBox Background="Azure" Text="Hello" /> 
</Grid> 
+0

Ich denke, Sie müssen VerticalAlignment = "Top" für das Textfeld festlegen .. scheint standardmäßig dehnen zu sein. – Gishu

+1

+1. Schön und sauber. Jedes Mal, wenn ich versuche, das Layout durch Bindung an eine tatsächliche Breite zu verwalten (wie in der akzeptierten Antwort), werden die Dinge unordentlich. –

+1

Ich bin gerade auf diese Frage gestoßen, als ich versuchte, das gleiche Problem zu lösen. In meinem Fall ist dies die beste Antwort, da es in WinRT funktioniert. Die andere Antwort nicht, weil Sie in WinRT nicht an ActualWidth binden können. – Slade

8

Beide Antworten für das Problem gegeben habe ich gesagt - Danke!

In meiner realen Anwendung versuchte ich jedoch, ein Panel in einem ScrollViewer zu beschränken, und Kent's Methode behandelte das nicht sehr gut, aus irgendeinem Grund, den ich nicht aufgespürt hatte. Grundsätzlich konnten die Steuerelemente über die MaxWidth-Einstellung hinaus erweitert und meine Absicht besiegt werden.

Nirs Technik funktionierte gut und hatte nicht das Problem mit dem ScrollViewer, obwohl es eine Kleinigkeit gibt, auf die man achten sollte. Sie möchten sicher sein, dass der rechte und linke Rand der TextBox auf 0 gesetzt sind oder sie in die Quere kommen. Ich änderte auch die Bindung, um ViewportWidth anstelle von ActualWidth zu verwenden, um Probleme zu vermeiden, wenn die vertikale Bildlaufleiste angezeigt wurde.

6

können Sie diese verwenden, um die Breite des Datatemplate:

Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}" 

Achten Sie darauf, Ihre Datatemplate Wurzel Margin = „0“ (Sie einige Panel als Wurzel verwenden können und stellen Sie die Margin für die Kinder dass root)

0

I SharedGroupSize

<Grid> 
    <Grid.ColumnDefinition> 
     <ColumnDefinition SharedGroupSize="col1"></ColumnDefinition> 
     <ColumnDefinition SharedGroupSize="col2"></ColumnDefinition> 
    </Grid.ColumnDefinition> 
    <TextBox Background="Azure" Text="Hello" Grid.Column="1" MaxWidth="200" /> 
</Grid>