2010-12-31 4 views
1

Я загружаю Textbox и Button в горизонтальный StackPanel программно. Размер кнопки (который содержит только Image) исправлен, но я не могу получить текстовое поле, чтобы заполнить доступную ширину его родителя. Это то, что код выглядит следующим образом:Связывание ширины TextBox с его фактическим шириной родительского контейнера

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

Если я раскомментировать параметр MinWidth для текстового поля оно отображается как я хочу его, но я хотел бы, чтобы не указать ширину в явном виде. Я попытался добавление связывания следующим образом, но это не работает вообще (текстовое поле просто исчезает!)

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

Спасибо за вашу помощь заранее!

ответ

7

Вместо того, чтобы использовать StackPanel (который всегда пытается сохранить элементы, как малые, как это может так, что все они подходят), использовать Grid. Тогда вы могли бы сделать что-то вроде этого:

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

Вы можете преобразовать это код вместо XAML, если вы предпочитаете, XAML просто проще набрать здесь, на лету.

0

Правильный ответ - не делать этого. См. Мой ответ at this question, и эта же идея относится к Silverlight на Windows Phone.

В вашем примере вы должны использовать DockPanel.

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

Это похоже на то, что мне нужно, но я не могу найти DockPanel в Silverlight Toolkit для Windows Phone. Я просто попробовал переустановить его, чтобы убедиться, что у меня есть последняя версия, но все равно не повезло. – Praetorian

+0

Следует проявлять осторожность при принятии решения об использовании компонентов инструментария. Это добавит общий размер Xap, который может быть важным фактором для WP7. Если единственная причина для добавления DLL инструментария - это получить эту функцию, нужно искать альтернативное решение без инструментария. – AnthonyWJones

+0

Очень хороший момент, Энтони. Если вы еще не используете инструментарий Silverlight, я бы использовал Grid. Но наличие DockPanel чрезвычайно полезно для различных макетов. Вы можете почти всегда использовать Grid для таких макетов, но, как вы можете видеть в ответе Остина, макеты на основе грида могут стать довольно подробными. – Josh

Смежные вопросы