从WPF中的UserControl继承

时间:2008-11-06 15:26:35

标签: wpf inheritance user-controls

我是WPF的新手,我遇到了从用户控件继承的问题。

我创建了一个用户控件,现在我需要继承该控件并添加更多功能。

以前有人做过这种事吗?任何帮助将不胜感激。

谢谢

6 个答案:

答案 0 :(得分:27)

嗯..你创建基础控件

public abstract class BaseUserControl : UserControl{...}

然后在XAML文件中:

<Controls:BaseUserControl x:Class="Termo.Win.Controls.ChildControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Namespace.Of.Your.BaseControl">

这应该有用。

编辑:嗯..当你有一个没有XAML的基本控件然后继承它时,这个例子很有用。反过来(从Xaml的基础控件) - 我不知道你怎么能去做。

EDIT2:显然来自this post + comments我认为你想要的可能是不可能的。

答案 1 :(得分:15)

AFAIK你不能继承xaml,你只能继承后面的代码。

我们最近在项目中遇到了同样的问题。我们最终解决问题的方法是创建一个usercontrol并将其添加到“child”用户控件中。

如果这不起作用/帮助看看这个: http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx 1

答案 2 :(得分:4)

我可能有一些解决方案:组合而不是继承 - 我已经提出了控制,通过数据绑定从外部分配“内容槽”,查看我的SO thread

使用示例:

<UserControl ... >

    <!-- My wrapping XAML -->
        <Common:DialogControl>
                <Common:DialogControl.Heading>
                        <!-- Slot for a string -->
                </Common:DialogControl.Heading>
                <Common:DialogControl.Control>
                        <!-- Concrete dialog's content goes here -->
                </Common:DialogControl.Control>
                <Common:DialogControl.Buttons>
                        <!-- Concrete dialog's buttons go here -->
                </Common:DialogControl.Buttons>
        </Common:DialogControl>
    <!-- /My wrapping XAML -->

</UserControl>

与代码隐藏中的一些处理代码一起,它将成为对话窗口的一个很好的基本组件。

答案 3 :(得分:2)

您可以使用delegate

来完成此操作

基本上,您需要创建一个包含所需功能的接口(YourInterface),然后让用户控件和类实现该接口。

接下来,确保用户控件具有对IYourInterface类型对象的引用,以便当用户控件尝试调用Interface的方法时,它会调用您的类'方法。

因为用户控件和类都实现了相同的接口,所以它们可以被视为同一种对象 - 这意味着您可以将它们都放入IYourInterface类型的对象集合中。这应该会给你你想要的行为。

在ASP.NET中,我经常使用这种技术,让我的类继承自abstract class祖先。我不明白为什么WPF不支持这个。 :(

答案 4 :(得分:2)

你不能自己继承xaml代码。但是,创建一个代码隐藏的抽象类,将允许您在派生类对象后面编写代码。

Xaml代码:{Window1.xaml}

<Window 
x:Class="WPFSamples.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="auto" Width="256" Title="WPF Sameples">
  <Grid>
    <Button x:Name="Button1" VerticalAlignment="Center" HorizontalAlignment="Center" Content="Click Me"/>
  </Grid>
</Window>

CodeBehind:{Window1.xaml.cs}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFSamples
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public abstract partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }
}

派生类:{DisabledButtonWindow.cs}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WPFSamples
{
    public sealed class DisabledButtonWindow : Window1
    {
        public DisabledButtonWindow()
        {
            Button1.IsEnabled = false;
        }
    }
}

虽然你不能从它自己的wpf源继承,你可以使用这个“Window1”控件作为所有其他派生控件的模板。

答案 5 :(得分:1)

我认为你可以做到这一点,但是你必须重新定义任何函数,以及你在子类的xaml中引用的其他东西。

IE如果您在基类xaml中订阅了按钮单击事件,则需要覆盖子类中的按钮单击并调用基类按钮单击事件。

不是百分之百确定细节,因为它是我的同事代码,但我认为这将为任何希望将来实现此功能的人提供一个开始。