【问题标题】:C# User Control that can contain other Controls (when using it)可以包含其他控件的 C# 用户控件(使用时)
【发布时间】:2009-06-09 12:36:59
【问题描述】:

我为 ASP 找到了一些关于这个问题的信息,但对我没有多大帮助......

我想做的是:我想创建一个用户控件,它有一个集合作为属性和按钮来浏览这个集合。我希望能够将此用户控件绑定到一个集合并在其上显示不同的控件(包含来自该集合的数据)。 就像您在表单下边缘的 MS Access 中所拥有的一样......

更准确地说:

当我在我的应用程序中实际使用控件时(在我创建它之后),我希望能够在<myControly></mycontrol> 之间向它添加多个控件(文本框、标签等) 如果我现在这样做,我的用户控件上的控件就会消失。

【问题讨论】:

  • 有什么问题?这听起来很容易做到……
  • 问题不在于集合和导航按钮,而是当我在另一个应用程序中使用它时,我希望能够向用户控件添加控件。
  • 如果我尝试在 和 之间放置多个控件,则会出现一个错误,即我只能在其中放置一个控件。如果我尝试使用网格,我的自定义控件上的控件就会消失。
  • 我想看看代码。如果我正确地遵循 MAD9,他想要一个用户控件,其中部分内容是静态的,但它也有一个部分,您可以在其中添加来自父窗口 XAML 的控件。
  • 到目前为止非常感谢你们!两件事:我不是以英语为母语的人,所以请原谅我对实际问题的描述可能不准确。我不知道有项目控制这样的东西,所以我会检查一下它可以做什么。如果不是,我需要什么我会尝试 Nirs 解决方案(或者两者都可以,这样我可以学到一些东西)。再次,非常感谢!

标签: c# wpf user-controls


【解决方案1】:

这里是一个做你想做的事的方法的例子:

一、代码——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 我在玩这个相同的解决方案,但我不能让它工作——我错过了内容演示者的内容属性上的绑定。
  • 也考虑这个线程:stackoverflow.com/questions/1017421/… 这是我最终实现的解决方案。正如我所注意到的,该控件甚至不需要包含其他控件。
【解决方案2】:

我很难理解你的问题,但我认为你描述的是一个 ItemsControl 使用 DataTemplates 来显示(大概)一个 ObservableCollection(T) 的内容。

【讨论】:

  • 您的答案更符合我的需要(我相信),但 Nirs 的解决方案更符合我上面的描述。因为只有一个答案是可能的,所以我勾选了他的一个。但我目前正在评估 Items 控件可以做什么,这似乎与我的想法差不多(有一些自定义)。谢谢!
【解决方案3】:

UserControl 可能不是执行此操作的最佳方式。您想在内容周围添加装饰,这基本上是 Border 所做的:它有一个子元素,并且它在边缘添加自己的东西。

查看装饰器类,它是 Border 的后代。如果您制作自己的 Border 后代,您应该可以轻松地做自己想做的事。但是,我相信这需要编写代码,而不是 XAML。

您可能仍想制作一个 UserControl 来包装底部的按钮,这样您就可以在部分流程中使用可视化设计器。但是 Decorator 是一种将各个部分粘合在一起并允许用户定义内容的好方法。

【讨论】:

    【解决方案4】:

    这是一个内置控件 (HeaderedContentControl) 的 link,除了它是自 .Net 3.0 以来 WPF 中的现有控件之外,它的作用与接受的答案相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多