在XAML中绑定高度/宽度到子元素

时间:2015-02-16 07:26:31

标签: c# xaml winrt-xaml windows-8.1

首先让我先说抱歉,如果这是重复的话。我无法在我读过的任何类似帖子中找到答案。我遇到一个问题,我有一个Border控件,其HeightWidth绑定到ActualHeight的{​​{1}}和ActualWidthTextBlock的孩子。

设计器中的所有内容都显示正常,但由于某些原因,在运行时,Border控件不可见。我不确定是不是因为BorderHeight可能是Width,或者0可能是以其他方式设置的。如果我对Visibility / Height进行硬编码,那么设计器和运行时的所有内容都会显示相同的内容,但是这种绑定会产生奇怪的影响。更奇怪的是,他们之前在工作,我不知道我能做些什么来打破它们。这是我的XAML:

Width

XAML中的第二个<Grid Visibility="{Binding Path=Contacts.Count, Converter={StaticResource ItemCountToVisibilityConverter}}" > <Border CornerRadius="5" BorderBrush="White" BorderThickness="2" Padding="20,15,0,15" Margin="0,15,0,15"> <ListView ItemsSource="{Binding Path=Contacts}"> <ListView.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Path=Name}" /> <TextBlock Text="{Binding Path=Number}" /> <TextBlock Text="{Binding Path=EmailAddress}" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </Border> <Border Background="White" CornerRadius="5" Height="{Binding Path=ActualHeight, ElementName=ContactsTextBlock}" Width="{Binding Path=ActualWidth, ElementName=ContactsTextBlock}" VerticalAlignment="Top"> <TextBlock Text="Contact Information" x:Name="ContactsTextBlock" Foreground="Black" Padding="5,2,5,2" HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> </Grid> 控件存在问题。正如我所说,它在设计器中正确显示,但由于某些原因,在运行时,Border控件及其包含的Border不可见。此外,TextBlock工作正常,以及Grid和第一个ListView。它只是第二个Border而且Border无法正常运行。

提前致谢!

以下是设计时的样子:

contact info image

2 个答案:

答案 0 :(得分:2)

让网格为你做肮脏的工作。我相信Grid是WPF最好的控件之一。

诀窍是将垂直空间划分为三个切片,其中顶部的两个切片的大小相应于所需的空间。也就是说,TextBlock将确定行对的高度。除了享受结果之外,你不必做任何事......

以下是一个示例XAML(为简单起见,我剪切了Visibility属性):

<Grid Margin="40,20">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Border 
        CornerRadius="5"
        BorderBrush="White"
        BorderThickness="2"
        Padding="20,15,20,15"
        Background="DimGray"
        Grid.Row="1"
        Grid.RowSpan="2"
        >
        <ListView ItemsSource="{Binding Path=Contacts}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Name}" />
                        <TextBlock Text="{Binding Path=Number}" />
                        <TextBlock Text="{Binding Path=EmailAddress}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Border>

    <Border 
        Background="White"
        CornerRadius="5"
        Grid.Row="0"
        Grid.RowSpan="2"
        HorizontalAlignment="Center"
        >
        <TextBlock 
            Text="Contact Information"  
            x:Name="ContactsTextBlock"
            Foreground="Black"
            Padding="5,2,5,2"
            />
    </Border>
</Grid>

请注意,ListView边框正在共享中间行,因此边线将会运行&#34; striking&#34;文本。

呈现如下:

enter image description here

答案 1 :(得分:0)

您可能需要设置BorderThicknessBorderBrush

 <Border Background="White"
     Border Background="White"
     CornerRadius="5"
     BorderThickness="1"
     BorderBrush="Gray"
     HorizontalAlignment="Center"
     VerticalAlignment="Top">
    <TextBlock Text="Contact Information"  
             x:Name="ContactsTextBlock"
             Foreground="Black"
             Padding="5,2,5,2"
             HorizontalAlignment="Center"
             VerticalAlignment="Center" />
</Border>