Наследование с помощью UserControl в WPF
Я новичок в WPF, и у меня проблема с наследованием от пользовательского элемента управления.
Я создал User Control, и теперь мне нужно наследовать этот элемент управления и добавить еще несколько функций.
Кто-нибудь делает это раньше? Любая помощь будет принята с благодарностью.
Спасибо
Ответы
Ответ 1
AFAIK вы не можете наследовать xaml, вы можете наследовать только код.
Недавно мы столкнулись с той же проблемой в нашем проекте. То, как мы решили решить нашу проблему, заключалось в создании пользовательского контроля и добавлении его в "дочерний" пользовательский контроль.
Если это не поможет/поможет взглянуть на это:
http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx 1
Ответ 2
Ну.. вы создаете свой базовый элемент управления
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">
И это должно работать.
EDIT: Хм.. этот пример полезен, когда у вас есть базовый элемент управления без XAML, а затем наследуется от него. Другой способ (от базового элемента управления с помощью Xaml) - я не уверен, как вы можете это сделать.
EDIT2: По-видимому, из этот пост + комментарии Я принимаю то, что вы хотите, возможно, не будет возможным.
Ответ 3
У меня может быть немного решения: состав вместо наследования - я пришел с контролем, у которого есть "слоты для контента", назначаемые извне через привязку данных, посмотрите на SO нить.
Пример использования:
<UserControl ... >
<!-- My wrapping XAML -->
<Common:DialogControl>
<Common:DialogControl.Heading>
<!-- Slot for a string -->
</Common:DialogControl.Heading>
<Common:DialogControl.Control>
<!-- Concrete dialog content goes here -->
</Common:DialogControl.Control>
<Common:DialogControl.Buttons>
<!-- Concrete dialog buttons go here -->
</Common:DialogControl.Buttons>
</Common:DialogControl>
<!-- /My wrapping XAML -->
</UserControl>
Вместе с некоторым кодом обработки кода он будет хорошим базовым компонентом для диалоговых окон.
Ответ 4
Вы можете выполнить это, используя delegate
.
По сути, вам нужно создать интерфейс (YourInterface
), который завершает нужные функции, а затем сделает как пользовательский элемент управления, так и ваш класс реализует этот интерфейс.
Затем убедитесь, что пользовательский элемент управления имеет ссылку на объект типа IYourInterface
, поэтому, когда ваш пользовательский элемент управления пытается вызвать метод Interface
, он вызывает метод вашего класса.
Поскольку и пользовательский элемент управления, и класс реализуют один и тот же интерфейс, их можно рассматривать как один и тот же объект - это означает, что вы можете поместить их в коллекцию объектов типа IYourInterface
. Это должно дать вам поведение, которое вы хотите.
В ASP.NET я часто использую эту технику, поскольку мои классы наследуют от предков abstract class
. Я не понимаю, почему WPF не поддерживает это.: (
Ответ 5
Вы не можете наследовать сам код xaml. Однако создание абстрактного класса codebehind позволит вам редактировать код позади, из объекта производного класса.
Код 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" в качестве шаблона для всех других производных элементов управления.
Ответ 6
Я думаю, что вы можете это сделать, но вам придется переопределить любые функции и, возможно, некоторые другие вещи, которые вы укажете в xaml в дочернем классе.
IE, если у вас есть событие нажатия кнопки, которое вы подписываете в базовом классе xaml, вам нужно переопределить кнопку щелчка в дочернем классе и вызвать событие нажатия кнопки базового класса.
Не сто процентов уверены в деталях, так как это код моего коллеги, из которого я рисую, но думал, что это даст начало любому, кто хочет реализовать это в будущем.