C#用户控件,可包含其他控件(在使用时)

8
我发现了一些关于ASP问题的内容,但对我帮助不大...我想做的是:创建一个用户控件,它具有集合作为属性和用于浏览此集合的按钮。我想能够将此用户控件绑定到集合并在其中显示不同的控件(包含来自该集合的数据)。就像你在MS Access表单的下边缘所看到的那样...
更精确地说:
当我实际在我的应用程序中使用控件(在我创建它之后),我想能够在和之间添加多个控件(文本框、标签等)。如果我现在这样做,我的用户控件上的控件会消失。

2
有什么问题吗?这听起来很容易做到... - Tony
问题不在于集合和导航按钮,而是当我在另一个应用程序中使用用户控件时,希望能够添加控件的功能。 - Michael Niemand
如果我尝试在<myControly>和</mycontrol>之间放置多个控件,就会出现错误,提示我只能放置一个控件。如果我尝试使用网格,我的自定义控件上的控件会消失。 - Michael Niemand
我想看看实现它的代码。如果我正确理解了MAD9的意思,他想要一个用户控件,其中部分内容是静态的,但也有一个可以从父窗口XAML中添加控件的部分。 - JMarsch
非常感谢大家迄今为止的帮助!有两件事:我不是母语为英语的人,所以请原谅我可能不太准确地描述实际问题。我不知道有一个叫做“项控件”的东西,所以我会看看那个东西能做什么。如果它不能满足我的需求,我会尝试Nir的解决方案(或者也许两个都试一下,这样我就可以学到更多)。再次感谢大家! - Michael Niemand
4个回答

11

这里是实现您所需功能的一种示例:

首先,代码 - UserControl1.xaml.cs

public partial class UserControl1 : UserControl
{
    public static readonly DependencyProperty MyContentProperty =
        DependencyProperty.Register("MyContent", typeof(object), typeof(UserControl1));


    public UserControl1()
    {
        InitializeComponent();
    }

    public object MyContent
    {
        get { return GetValue(MyContentProperty); }
        set { SetValue(MyContentProperty, value); }
    }
}

还有用户控件的 XAML - UserControl1.xaml

<UserControl x:Class="InCtrl.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300" Name="MyCtrl">
    <StackPanel>
        <Button Content="Up"/>
        <ContentPresenter Content="{Binding ElementName=MyCtrl, Path=MyContent}"/>
        <Button Content="Down"/>
    </StackPanel>
</UserControl>

最后,使用我们精美新控件的XAML:

<Window x:Class="InCtrl.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:me="clr-namespace:InCtrl"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <me:UserControl1>
            <me:UserControl1.MyContent>
                <Button Content="Middle"/>
            </me:UserControl1.MyContent>
        </me:UserControl1>
    </Grid>
</Window>

@Nir +1 我也在尝试这个解决方案,但是我没能让它正常工作——我忘记了给内容呈现器的内容属性绑定。 - JMarsch
这是我最终实现的解决方案。我注意到,甚至不需要控件包含其他控件。另外,请考虑这个线程:http://stackoverflow.com/questions/1017421/access-like-data-navigation-in-wpf - Michael Niemand

1

你的回答更符合我的需求(我相信),但是Nir的解决方案更准确地实现了我上面所描述的。由于只能选择一个答案,我选择了他的。但是我目前正在评估Items控件的功能,它似乎正是我想要的(带有一些自定义)。谢谢! - Michael Niemand

0

使用UserControl可能不是最好的方法。您想要在内容周围添加装饰,这基本上就是Border所做的:它有一个子元素,并在边缘添加自己的东西。

研究一下Decorator类,它是Border的后代。如果您制作自己的Border后代,应该很容易做到您想要的。但是,我认为这需要编写代码,而不是XAML。

您可能仍然希望创建一个UserControl来包装底部的按钮,以便您可以在过程的一部分中使用可视化设计器。但是,Decorator将是将各个部分粘合在一起并允许用户定义内容的好方法。


0

这里有一个链接,指向一个内置控件(HeaderedContentControl),它与被接受的答案做的事情相同,但它是自 .Net 3.0 以来在 WPF 中存在的控件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接