将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>
如果有人想知道我是怎么做到的,它是这样的。
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();
}