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

时间:2016-09-13 12:10:56

标签: c# wpf xaml

我一直试图为问卷调查应用程序设置用户控件,在某些情况下,我有一些问题需要后续问题。一个简单的场景可能是我们想要显示后续问题,如果我们得到一个"是"在某些问题上。

此时我已经按照Zenexer on a similar question中的示例进行了操作。我的想法是,我将我的用户控件的第一个孩子放在一个容器(StackPanel或其他)和所有容器中 第二个StackPanel中的后续元素。但是在aforementioned example中,所有子元素都被填充到用户控件中的一个元素中。据我所知,这是因为[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>

1 个答案:

答案 0 :(得分:0)

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

SubQuestionBox.xaml 与原始问题类似

<强> SubQuestionBox.xaml.cs Children属性为the example of @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();
}