将 height/width 绑定到 XAML 中的 child 元素
binding height/width to child element in XAML
首先让我说声抱歉,如果这是重复的。我无法在我阅读过的任何类似帖子中找到答案。我遇到一个问题,我有一个 Border
控件,其 Height
和 Width
绑定到 TextBlock
的 ActualHeight
和 ActualWidth
是 Border
.
的 child
设计器中一切正常,但由于某些原因 run-time,Border
控件不可见。我不确定是不是因为 Height
或 Width
可能是 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
都正常工作。只是第二个 Border
和 TextBlock
没有正常工作。
提前致谢!
这是 design-time 的样子:
您可能需要设置 BorderThickness
和 BorderBrush
:
<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" 文本。
呈现如下:
首先让我说声抱歉,如果这是重复的。我无法在我阅读过的任何类似帖子中找到答案。我遇到一个问题,我有一个 Border
控件,其 Height
和 Width
绑定到 TextBlock
的 ActualHeight
和 ActualWidth
是 Border
.
设计器中一切正常,但由于某些原因 run-time,Border
控件不可见。我不确定是不是因为 Height
或 Width
可能是 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
都正常工作。只是第二个 Border
和 TextBlock
没有正常工作。
提前致谢!
这是 design-time 的样子:
您可能需要设置 BorderThickness
和 BorderBrush
:
<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" 文本。
呈现如下: