2010-12-31 9 views
1

Ich lade eine Textbox und eine Button in eine horizontale StackPanel programmgesteuert. Die Größe der Schaltfläche (die nur eine Image enthält) ist behoben, aber ich kann die Textbox nicht erreichen, um die verfügbare Breite ihrer Eltern zu füllen. Dies ist, was der Code wie folgt aussieht:Die Breite einer TextBox an die ActualWidth des übergeordneten Containers binden

StackPanel parent = new StackPanel() { 
    Orientation = Orientation.Horizontal, 
    HorizontalAlignment = HorizontalAlignment.Stretch, 
    VerticalAlignment = VerticalAlignment.Top, 
}; 

TextBox textbox = new TextBox() { 
    HorizontalAlignment = HorizontalAlignment.Stretch, 
    VerticalAlignment = VerticalAlignment.Top, 
    //MinWidth = 375, 
}; 

Button btn = new Button() { 
    Content = new Image() { 
    MaxHeight = 40, 
    MaxWidth = 40, 
    MinHeight = 40, 
    MinWidth = 40, 
    Margin = new Thickness(0), 
    Source = new BitmapImage( 
     new Uri("btnimage.png", UriKind.Relative)), 
    }, 
    HorizontalAlignment = HorizontalAlignment.Right, 
    BorderBrush = new SolidColorBrush(Colors.Transparent), 
    Margin = new Thickness(0), 
}; 
btn.Click += ((s, e) => OnBtnClicked(s, e, textbox)); 

parent.Children.Add(textbox); 
parent.Children.Add(btn); 

Wenn ich die MinWidth Einstellung für die Textbox Kommentar- es angezeigt wird, wie ich es will, aber ich möchte nicht eine Breite explizit angeben müssen. Ich habe versucht, eine verbindliche Zugabe wie folgt aber, dass überhaupt nicht arbeiten (die Textbox verschwindet einfach!)

Binding widthBinding = new Binding() { 
    Source = parent.ActualWidth, 
}; 
passwdBox.SetBinding(TextBox.WidthProperty, widthBinding); 

Vielen Dank für Ihre Hilfe im Voraus!

Antwort

7

Statt StackPanel verwenden (was immer versucht, Elemente so klein zu halten wie möglich, so dass sie alle passen), eine Grid verwenden. Dann könnten Sie so etwas tun:

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="*"/> <!-- Note "*" means to use the rest of the space --> 
    <ColumnDefinition Width="40"/> 
    </Grid.ColumnDefinitions> 
    <TextBox Grid.Column="0"/> 
    <Button Grid.Column="1"> 
    <Button.Content> 
     <Image .../> 
    </Button.Content> 
    </Button> 
</Grid> 

du umwandeln kann anstelle von XAML zu codieren, wenn Sie es vorziehen, XAML ist nur einfacher, hier zu on-the-fly-Typ.

0

Die richtige Antwort ist es nicht tun. Siehe meine Antwort at this question und die gleiche Idee gilt für Silverlight auf Windows Phone.

In Ihrem Beispiel sollten Sie eine DockPanel verwenden.

<toolkit:DockPanel> 
    <Button toolkit:DockPanel.Dock="Right" /> 
    <TextBox /> <!-- fill is implied --> 
</toolkit:DockPanel> 
+0

Das sieht aus, was ich brauche, aber ich kann 'DockPanel' im Silverlight Toolkit für Windows Phone nicht finden. Ich habe gerade versucht, es neu zu installieren, um sicherzustellen, dass ich die neueste Version habe, aber immer noch kein Glück. – Praetorian

+0

Bei der Entscheidung, Toolkit-Komponenten zu verwenden, ist Vorsicht geboten. Dies wird zur Gesamtgröße des Xap beitragen, was bei WP7 eine wichtige Überlegung sein kann. Wenn der einzige Grund, eine Toolkit-DLL hinzuzufügen, darin besteht, diese eine Funktion zu erhalten, sollte eine alternative Lösung ohne Toolkit gesucht werden. – AnthonyWJones

+0

Sehr guter Punkt, Anthony. Wenn Sie das Silverlight-Toolkit nicht bereits verwenden, würde ich ein Grid verwenden. Aber DockPanel ist extrem nützlich für eine Vielzahl von Layouts. Sie können fast immer ein Raster für solche Layouts verwenden, aber wie Sie in Austins Antwort sehen können, können Raster-basierte Layouts ziemlich ausführlich werden. – Josh