Привязка TextBox's Width к ActualWidth его родительского контейнера - PullRequest
1 голос
/ 31 декабря 2010

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

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

Заранее спасибо за помощь!

Ответы [ 2 ]

7 голосов
/ 31 декабря 2010

Вместо использования 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 голосов
/ 31 декабря 2010

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

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

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