我对 WPF 相当陌生,并且在从用户控件继承时遇到问题。
我创建了一个用户控件,现在我需要从该控件继承并添加更多功能。
以前有人做过这种事情吗?任何帮助将不胜感激。
谢谢
我对 WPF 相当陌生,并且在从用户控件继承时遇到问题。
我创建了一个用户控件,现在我需要从该控件继承并添加更多功能。
以前有人做过这种事情吗?任何帮助将不胜感激。
谢谢
好吧..你创建你的基本控制
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:显然从这篇文章+评论我认为你想要的可能是不可能的。
AFAIK你不能继承xaml,你只能继承后面的代码。
我们最近在我们的项目中遇到了同样的问题。我们最终解决问题的方法是创建一个用户控件并将其添加到“子”用户控件。
如果这不起作用/帮助看看这个: http: //geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx 1
我可能有一些解决方案:组合而不是继承 - 我想出了控制,它具有可通过数据绑定从外部分配的“内容槽”,请查看我的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>
与代码隐藏中的一些处理代码一起,它将成为对话窗口的一个很好的基础组件。
您不能继承它自己的 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”控件用作所有其他派生控件的模板。
您可以通过使用delegate
.
本质上,您需要创建一个YourInterface
包含所需功能的接口 ( ),然后让用户控件和您的类都实现该接口。
接下来,确保用户控件具有对类型对象的引用IYourInterface
,以便当您的用户控件尝试调用 的方法时Interface
,它会调用您的类的方法。
因为用户控件和类都实现了相同的接口,所以它们可以被视为同一种对象——这意味着您可以将它们都放入类型为对象的集合中IYourInterface
。这应该给你你想要的行为。
在 ASP.NET 中,我经常使用这种技术,方法是让我的类从abstract class
祖先那里继承。我不明白为什么 WPF 不支持这个。:(
我认为您可以这样做,但您必须重新定义您在子类的 xaml 中引用的任何函数以及可能的其他一些内容。
IE 如果您在基类 xaml 中订阅了按钮单击事件,则需要覆盖子类中的按钮单击并调用基类按钮单击事件。
不能百分百确定细节,因为这是我的同事代码,但我认为这将为希望在未来实现此功能的任何人提供一个开始。