如何通过用户的XAML动态控件添加到用户控件? [英] How to add controls dynamically to a UserControl through user's XAML?
问题描述
我要创建一个包含一个TextBlock和一个StackPanel中,将允许用户在他/她自己的控件添加到动态地在XAML用户控件的用户控件。
I want to create a user control that contains a TextBlock and a StackPanel that will allow the user to add his/her own controls to the user control dynamically in XAML.
下面是我的用户样本XAML:
Here is the sample XAML for my UserControl:
<UserControl x:Class="A1UserControlLibrary.UserControlStackPanel"
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"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="300">
<StackPanel>
<TextBlock Text="I want the user to be able to add any number of controls to the StackPanel below this TextBlock."
FontFamily="Arial" FontSize="12" FontWeight="DemiBold" Margin="5,10,5,10" TextWrapping="Wrap"/>
<StackPanel>
<!-- I want the user to be able to add any number of controls here -->
</StackPanel>
</StackPanel>
</UserControl>
我希望用户能够在他们的XAML中嵌入该用户的控制和添加他们自己的控件用户控制的堆叠面板:
I would like the user to be able to embed this user control in their XAML and add their own controls to the stack panel of the user control:
<uc:A1UserControl_StackPanel x:Name="MyUserControl_Test" Margin="10" Height="100">
<Button Name="MyButton1" Content="Click" Height="30" Width="50"/>
<Button Name="MyButton2" Content="Click" Height="30" Width="50"/>
<Button Name="MyButton3" Content="Click" Height="30" Width="50"/>
</uc:A1UserControl_StackPanel>
使用上述XAML不起作用这样做。任何想法?
Doing this using the above XAML does not work. Any ideas?
推荐答案
您的 的能做到这一点,虽然不是的非常的喜欢你的例子。你需要两件事情。首先是申报的DependencyProperty
类型的UIElement
,其中所有的控制扩展:
You can do that, although not quite like your example. You need two things. The first is to declare a DependencyProperty
of type UIElement
, of which all controls extend:
public static DependencyProperty InnerContentProperty = DependencyProperty.Register("InnerContent", typeof(UIElement), typeof(YourControl));
public UIElement InnerContent
{
get { return (UIElement)GetValue(InnerContentProperty); }
set { SetValue(InnerContentProperty, value); }
}
二是要声明一个 ContentControl中
在你想要的内容出现在XAML:
The second is to declare a ContentControl
in the XAML where you want the content to appear:
<StackPanel>
<TextBlock Text="I want the user to be able to add any number of controls to the StackPanel below this TextBlock."
FontFamily="Arial" FontSize="12" FontWeight="DemiBold" Margin="5,10,5,10" TextWrapping="Wrap"/>
<StackPanel>
<ContentControl Content="{Binding InnerContent, RelativeSource={RelativeSource AncestorType={x:Type YourXmlNamspacePrefix:ContentView}}}" />
</StackPanel>
</StackPanel>
在我看来,如果你使用的StackPanel
S,你的可能的发现,你的内容不能正确显示......我建议你使用电网
取值布局的目的为所有但最简单的布置的任务。
In my opinion, if you use StackPanel
s, you could find that your content does not get displayed correctly... I'd advise you to use Grid
s for layout purposes for all but the simplest layout tasks.
现在的一个区别你的例子是,你将如何的使用的你的控制。在 InnerContent
属性的类型为的UIElement
,这意味着它可容纳的有一个的的UIElement
。这意味着你需要使用一个容器元素,以显示多个项目,但它具有相同的最终结果是:
Now the one difference to your example is in how you would use your control. The InnerContent
property is of type UIElement
, which means that it can hold one UIElement
. This means that you need to use a container element to display more than one item, but it has the same end result:
<YourXmlNamspacePrefix:YourControl>
<YourXmlNamspacePrefix:YourControl.InnerContent>
<StackPanel x:Name="MyUserControl_Test" Margin="10" Height="100">
<Button Content="Click" Height="30" Width="50"/>
<Button Content="Click" Height="30" Width="50"/>
<Button Content="Click" Height="30" Width="50"/>
</StackPanel>
</YourXmlNamspacePrefix:YourControl.InnerContent>
</YourXmlNamspacePrefix:YourControl>
和结果:
更新>>>
有关备案的,我知道的究竟的你想要做什么。你,似乎有什么不明白的 I 的这样说,所以我会尽力解释它的最后一次的为您服务。添加按钮
与标签
属性设置为我已经向您展示:
For the record, I know exactly what you want to do. You, it seems, do not understand what I am saying, so I'll try to explain it one last time for you. Add a Button
with the Tag
property set as I've already shown you:
<Button Tag="MyButton1" Content="Click" Click="ButtonClick" />
现在添加一个点击
处理程序:
Now add a Click
handler:
private void ButtonClick(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
if (button.Tag = "MyButton1") DoSomething();
}
这是所有有给它。
这篇关于如何通过用户的XAML动态控件添加到用户控件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!