将 height/width 绑定到 XAML 中的 child 元素

binding height/width to child element in XAML

首先让我说声抱歉,如果这是重复的。我无法在我阅读过的任何类似帖子中找到答案。我遇到一个问题,我有一个 Border 控件,其 HeightWidth 绑定到 TextBlockActualHeightActualWidthBorder.

的 child

设计器中一切正常,但由于某些原因 run-time,Border 控件不可见。我不确定是不是因为 HeightWidth 可能是 0,或者 Visibility 可能是以其他方式设置的。如果我对 Height/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>

XAML 中的第二个 Border 控件有问题。正如我所说,它在设计器中正确显示,但由于某些原因在运行时,Border 控件及其包含的 TextBlock 不可见。此外,Grid 以及 ListView 和第一个 Border 都正常工作。只是第二个 BorderTextBlock 没有正常工作。

提前致谢!

这是 design-time 的样子:

您可能需要设置 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>

让网格为您完成繁重的工作。我相信 Grid 是 WPF 拥有的最好的控件之一。

诀窍是将垂直 space 分成三个部分,其中顶部的两个根据所需 space 调整大小。也就是说,TextBlock 将确定行对的高度。您无需做任何事情,只需享受结果...

这是一个示例 XAML(为了简单起见,我将可见性 属性 剪掉了):

<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 边框共享中间一行,因此边框线将 运行 "striking" 文本。

呈现如下: