我是WPF的新手,我遇到了从用户控件继承的问题。
我创建了一个用户控件,现在我需要继承该控件并添加更多功能。
以前有人做过这种事吗?任何帮助将不胜感激。
谢谢
答案 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中订阅了按钮单击事件,则需要覆盖子类中的按钮单击并调用基类按钮单击事件。
不是百分之百确定细节,因为它是我的同事代码,但我认为这将为任何希望将来实现此功能的人提供一个开始。