如何根据另一个控件调整控件大小? (WPF)

时间:2014-09-08 08:28:15

标签: c# wpf xaml

我有Label&我想要显示的Border(该行)如下

enter image description here

问题是客户名称可以是任何大小,然后它重叠在该行上。 有没有办法将线条与标签的大小联系起来?

注意:两个组件都位于Grid的同一单元格中。

3 个答案:

答案 0 :(得分:4)

这就是Grid的用途。您可以将网格放在网格的单元格内,也可以将外网格与ColumnSpan结合使用:

<Grid MaxWidth="240">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Label Content="Client Name" Grid.Column="0" />
    <Border Grid.Column="1" ... />
</Grid>

第一列可以获得所需的空间,第二列可以获得尽可能多的空间(可以更多,或更少,比它需要的更多)。我放在网格上的MaxWidth是可选的。它确保客户端名称超过一定长度时被切断。 还有其他几种方法可以做到这一点,但我发现Grid是最灵活,最容易维护的,尽管需要写更多的字符。

kidshaw给出的方法:

<DockPanel LastChildFill="True">
    <Label Content="Client Name" DockPanel.Dock="Left" />
    <Border ... />
</DockPanel>

下一个将在边框顶部绘制标签,但需要知道背景颜色,如果背景是渐变或图像,这将无效:

<Border ... />
<Label HorizontalAlignment="Left" Content="Client Name" Background="White" />

这是一个不同的问题,尽管提出的问题完全不同,但答案相同:How to get StackPanel's children to fill maximum space downward?

答案 1 :(得分:1)

彼得提供了一个很好的答案+1。

如果有兴趣的话,可以选择停靠面板。

将两个控件设置为左侧,并将面板设置为上次子填充...

<DockPanel LastChildFill="True">
<Label DockPanel.Dock="Left>
Label text
<\Label>
<Path dockpanel.dock="Left"/>
<\DockPanel>

答案 2 :(得分:1)

我发布了这个例子,虽然已经提到了很多。

  <StackPanel Orientation="Horizontal" VerticalAlignment="Center" Width="125">
    <TextBox Text="Lie" Name="Label1" MaxWidth="{Binding RelativeSource={RelativeSource AncestorType=StackPanel}, Path=Width}"/>
    <Border Background="CadetBlue" Height="5">
        <Border.Width>
            <MultiBinding Converter="{StaticResource Converter}">
                <Binding RelativeSource="{RelativeSource AncestorType=StackPanel}" Path="Width"/>
                <Binding ElementName="Label1" Path="ActualWidth"/>
            </MultiBinding>
        </Border.Width>
    </Border>
  </StackPanel>

[ValueConversion(typeof(double), typeof(double))]
public class MyConverterS : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        double panelWidth, elementWidth;
        Double.TryParse(values[0].ToString(), out panelWidth);
        Double.TryParse(values[1].ToString(), out elementWidth);
        if (panelWidth - elementWidth <= 0)
            return 0;
        return panelWidth - elementWidth;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}