Найти свойство элемента управления родного брата - PullRequest
1 голос
/ 08 июня 2019

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>

И родительский элемент управления, содержащий двух дочерних элементов:

<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.

Вот чтоон отображает:

enter image description here

То, что мы должны увидеть, это то, что правый заголовок имеет ту же высоту, что и левый, но как вымогу сказать, что это не так.

Я получаю следующее сообщение об ошибке в моем окне вывода, которое, как я понимаю, означает, что он не разрешает 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')

Любые идеичто я делаю не так?

1 Ответ

2 голосов
/ 08 июня 2019

Используйте SharedSizeGroup для синхронизации высот строк и удалите StackPanels в пользу строк сетки:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" SharedSizeGroup="HeaderGroup"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="1" Text="Girlie'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>
        <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>

Результат:

enter image description here

В зависимости от того, каким будет содержимое двух дочерних элементов управления, я настоятельно рекомендую использовать только один дочерний элемент UserControl и использовать MVVM для заполнения его различными данными.Это избавит от необходимости поддерживать два в основном идентичных элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...