将XAML子元素拆分为用户控件中的多个元素

本文关键字:元素 控件 XAML 拆分 用户 | 更新日期: 2023-09-27 18:06:52

我一直在尝试为问卷调查应用程序制作用户控件,其中我有一些问题需要在某些条件下进行后续问题。一个简单的场景可能是,如果我们在某个问题上得到"是",我们想要显示后续问题。

在这一点上,我已经按照Zenexer的例子解决了类似的问题。我的想法是,我会把我的用户控件的第一个孩子在一个容器(一个StackPanel或其他)和所有第二个StackPanel中的后续元素。但是在前面的例子中,所有的子元素都被塞进了用户控件的一个元素中。根据我的理解,这是因为[ContentProperty(nameof(Children))]被设置为用户控件的所有内容。

我试图在Zenexer的示例中更改Children的getter和setter,但无济于事。

: 是否有一种方法可以将用户控件的子元素拆分为用户控件中的两个(或更多)XAML元素,看起来像这样:

MainWindow.xaml

<SubQuestionBox>
    <BinaryQuestion
            QuestionNumber="4.1"
            QuestionText="Parent question"/>
    <TextQuestion
            QuestionNumber="4.1.1"
            QuestionText="Child question 1"/>
    <TextQuestion
            QuestionNumber="4.1.2"
            QuestionText="Child question 2"/>
</SubQuestionBox>

SubQuestionBox.xaml

<UserControl x:Class="SubQuestionBox">
    <!--StackPanel To contain the question controls-->
    <StackPanel>
        <StackPanel x:Name="ParentContainer" />
        <StackPanel x:Name="SubQuestionsContainer" />
    </StackPanel>
</UserControl>

将XAML子元素拆分为用户控件中的多个元素

如果有人想知道我是怎么做到的,它是这样的。

SubQuestionBox。xaml类似于原来的问题

SubQuestionBox.xaml.cs Children属性与@Zenexer

示例中的DependencyProperty类似。
public SubQuestionBox()
{
    InitializeComponent();
    Children = SubQuestionsContainer.Children;
    // add listener for Loaded event and call OnLoaded()     
    Loaded += OnLoaded; 
    if (ParentQuestion != null)
        // The BinaryQuestion has a AnswerChanged event
        ParentQuestion.AnswerChanged += ToggleCollapse;
}
public void DistributeQuestions()
{
    // This method seems super hacky to me. 
    // I would have thought there is a more elegant way
    UIElement parent = null;
    if (Children != null)
    {
        parent = Children[0];
        Children.RemoveAt(0);
    }
    if (ParentContainer != null && parent != null)
    {
        ParentContainer.Children.Add(parent);
    }
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
    DistributeQuestions();
}