34

我对 WPF 相当陌生,并且在从用户控件继承时遇到问题。

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

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

谢谢

4

6 回答 6

30

好吧..你创建你的基本控制

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:显然从这篇文章+评论我认为你想要的可能是不可能的。

于 2008-11-06T15:32:48.543 回答
18

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

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

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

于 2008-11-07T06:56:50.817 回答
4

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

使用示例:

<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>

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

于 2009-06-23T18:06:13.740 回答
3

您不能继承它自己的 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>

代码隐藏:{ 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”控件用作所有其他派生控件的模板。

于 2011-10-20T15:19:29.513 回答
1

您可以通过使用delegate.

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

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

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

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

于 2011-01-30T13:59:38.480 回答
1

我认为您可以这样做,但您必须重新定义您在子类的 xaml 中引用的任何函数以及可能的其他一些内容。

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

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

于 2013-04-25T17:31:15.457 回答