Подтвердить что ты не робот

Наследование с помощью UserControl в WPF

Я новичок в WPF, и у меня проблема с наследованием от пользовательского элемента управления.

Я создал User Control, и теперь мне нужно наследовать этот элемент управления и добавить еще несколько функций.

Кто-нибудь делает это раньше? Любая помощь будет принята с благодарностью.

Спасибо

4b9b3361

Ответ 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, вам нужно переопределить кнопку щелчка в дочернем классе и вызвать событие нажатия кнопки базового класса.

Не сто процентов уверены в деталях, так как это код моего коллеги, из которого я рисую, но думал, что это даст начало любому, кто хочет реализовать это в будущем.