仅显示用户点击的项目,折叠其他项目

Show only item on which user clicks, collapse others

我有评论区,每条评论都可以回复。它看起来像这样:

<ListBox x:Name="list" ScrollViewer.VerticalScrollBarVisibility="Hidden" ItemsSource="{Binding Comments}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock x:Name="comment" FontSize="15" Foreground="Black" Text="{Binding Text}" TextWrapping="Wrap" Margin="0,1,0,5" Padding="{Binding Depth, Converter={StaticResource LevelToPaddingConverter}, ConverterParameter=15}"/>
                <Grid Grid.Row="1">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="auto"/>
                     </Grid.ColumnDefinitions>
                     <StackPanel Orientation="Horizontal">
                         <TextBlock x:Name="author" Style="{StaticResource commentInfo}" Text="{Binding UserId, Converter={StaticResource UserIdToUserNameConverter}}" Padding="{Binding Depth, Converter={StaticResource LevelToPaddingConverter}, ConverterParameter=15}"/>
                         <TextBlock Text="," Style="{StaticResource commentInfo}"/>
                         <TextBlock x:Name="timeAgo" Style="{StaticResource commentInfo}" Text="{Binding CreatedAt, Converter={StaticResource TimestampToAgoConverter}}"/>
                     </StackPanel>
 <!-- THIS BUTTON --><HyperlinkButton x:Name="reply" Grid.Column="1" FontSize="10" Foreground="Blue" Content="Reply" HorizontalAlignment="Right" Tapped="reply_Tapped"/>
                     <StackPanel x:Name="replyBox" Visibility="Collapsed" Margin="0,19,0,0">
                         <TextBox PlaceholderText="Write Comment..." FontSize="11" BorderBrush="Gray" BorderThickness="1" Margin="0,0,0,3" Height="50" GotFocus="TextBox_GotFocus" LostFocus="commentBox_LostFocus" TextWrapping="Wrap"/>
                         <Button Content="Post Reply" FontSize="12" Background="CornflowerBlue" BorderThickness="0" Style="{StaticResource ButtonStyle1}" Width="75" Height="25" HorizontalAlignment="Right" Tapped="PostCommentButton_Tapped"/>
                     </StackPanel>
                 </Grid>
             </StackPanel>
         </DataTemplate>
     </ListBox.ItemTemplate>
 </ListBox>

当用户点击该按钮时,评论的 TextBoxButton 将变为可见。但是,如果用户随后在另一条评论上单击 回复,则有两个 TextBox 可见(每个对应相关评论)。但我希望当用户点击 回复 到另一个评论时,之前的 TextBox 会崩溃,所以当时只有一个 TextBox 可见。我该怎么做?

我找到了解决方案。我在控件中遍历所有 StackPanels 并找到名称为 replyBox 的那些,然后折叠它们。
我是这样做的:

foreach (StackPanel sp in FindVisualChildren<StackPanel>(this))
{
    if (sp.Name == "replyBox")
    {
        sp.Visibility = Visibility.Collapsed;
    }
}
//and here showing function for the one I wnat to be visible

FindVisualChildren 函数如下所示:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }

我的想法来自 this answer