1

我正在以编程方式将 aTextbox和 a加载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 );

提前感谢您的帮助!

4

2 回答 2

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 更容易在此处即时键入。

于 2010-12-31T18:46:38.833 回答
0

正确的答案是不要这样做。请参阅我对这个问题的回答,同样的想法也适用于 Windows Phone 上的 Silverlight。

在您的示例中,您应该使用DockPanel.

<toolkit:DockPanel>
    <Button toolkit:DockPanel.Dock="Right" />
    <TextBox /> <!-- fill is implied -->
</toolkit:DockPanel>
于 2010-12-31T18:45:22.933 回答