Windows 10 Pro 64,VS 2019社区,WPF应用
我有一个应用程序,该应用程序的UserControl具有两个成员,每个成员都是一个UserControl,其中包含一个标题,标题为2 -3行文本,其下方是一个ListBox。我的目标是将一个标头的高度设置为另一个标头的高度,并且我选择将一个标头绑定到另一个标头来完成此操作。但是,似乎我的RelativeSource没有解析,这导致尝试将高度设置为NaN,这当然不会更改它。我尝试了多种不同的方式来表达RelativeSource,但没有一种起作用。这是最新的:
这是主窗口:
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyApp"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<local:MyParentControl x:Name="Daddy"/>
</Grid>
</Window>
以及包含两个孩子的Parent控件:
<UserControl x:Class="MyApp.MyParentControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyApp"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<StackPanel Orientation="Horizontal">
<local:MySonControl x:Name="Sonny"/>
<local:MyDaughterControl x:Name="Girlie"/>
</StackPanel>
</Grid>
</UserControl>
第一个子控件:
<UserControl x:Class="MyApp.MySonControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyApp"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical" x:Name="Header">
<TextBlock Text="Vertical space" HorizontalAlignment="Center"/>
<TextBlock Text="Sonny's Stuff" HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Column A" Margin="5,5,5,5"/>
<TextBlock Text="Column B" Margin="5,5,5,5"/>
<TextBlock Text="Column C" Margin="5,5,5,5"/>
</StackPanel>
</StackPanel>
<ListBox x:Name="Stuff"/>
</StackPanel>
</Grid>
</UserControl>
第二个包含绑定语句:
<UserControl x:Class="MyApp.MyDaughterControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyApp"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical" x:Name="Header"
Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MyParentControl}, Path=Sonny.Header.ActualHeight}"
>
<TextBlock Text="Girlie's Stuff" HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Column A" Margin="5,5,5,5"/>
<TextBlock Text="Column B" Margin="5,5,5,5"/>
<TextBlock Text="Column C" Margin="5,5,5,5"/>
</StackPanel>
</StackPanel>
<ListBox x:Name="Stuff"/>
</StackPanel>
</Grid>
</UserControl>
我没有碰到后面的代码,就像VS生成它一样。
这是显示的内容:
我们应该看到的是,右侧标头与左侧标头的高度相同,但是您可以知道,事实并非如此。
我在输出窗口中收到以下错误消息,这意味着它没有解决RelativeSource:
System.Windows.Data Error: 40 : BindingExpression path error: 'Sonny' property not found on 'object' ''MyParentControl' (Name='Daddy')'. BindingExpression:Path=Sonny.Header.ActualHeight; DataItem='MyParentControl' (Name='Daddy'); target element is 'StackPanel' (Name='Header'); target property is 'Height' (type 'Double')
关于我在做什么错的任何想法?
答案 0 :(得分:2)
使用SharedSizeGroup同步行的高度,并删除GridPanels以支持Grid行:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" SharedSizeGroup="HeaderGroup"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="Vertical space" HorizontalAlignment="Center"/>
<TextBlock Grid.Row="1" Text="Sonny's Stuff" HorizontalAlignment="Center"/>
<StackPanel Grid.Row="2" Orientation="Horizontal">
<TextBlock Text="Column A" Margin="5,5,5,5"/>
<TextBlock Text="Column B" Margin="5,5,5,5"/>
<TextBlock Text="Column C" Margin="5,5,5,5"/>
</StackPanel>
<ListBox Grid.Row="3" x:Name="Stuff"/>
</Grid>
<Grid IsSharedSizeScope="True">
<StackPanel Orientation="Horizontal">
<wpfApp2:MySonControl x:Name="Sonny"/>
<wpfApp2:MyDaughterControl x:Name="Girlie"/>
</StackPanel>
</Grid>
{{1}}
结果:
根据两个子控件的内容,我强烈建议仅使用一个子UserControl并使用MVVM用不同的数据填充它。这样就无需维护两个基本相同的控件。