Как WPF UserControl может наследовать WPF UserControl? - PullRequest
82 голосов
/ 20 мая 2009

Следующий WPF UserControl называется DataTypeWholeNumber , который работает.

Теперь я хочу создать UserControl с именем DataTypeDateTime и DataTypeEmail и т. Д.

Многие из свойств зависимостей будут общими для всех этих элементов управления, и поэтому я хочу поместить их общие методы в BaseDataType и каждый из этих пользовательских контролов наследуется от этого базового типа.

Однако, когда я это делаю, я получаю ошибку : частичное объявление может не иметь разных базовых классов .

Так как я могу реализовать наследование с помощью UserControls, чтобы общая функциональность была в базовом классе?

using System.Windows;
using System.Windows.Controls;

namespace TestDependencyProperty827.DataTypes
{
    public partial class DataTypeWholeNumber : BaseDataType
    {
        public DataTypeWholeNumber()
        {
            InitializeComponent();
            DataContext = this;

            //defaults
            TheWidth = 200;
        }

        public string TheLabel
        {
            get
            {
                return (string)GetValue(TheLabelProperty);
            }
            set
            {
                SetValue(TheLabelProperty, value);
            }
        }

        public static readonly DependencyProperty TheLabelProperty =
            DependencyProperty.Register("TheLabel", typeof(string), typeof(BaseDataType),
            new FrameworkPropertyMetadata());


        public string TheContent
        {
            get
            {
                return (string)GetValue(TheContentProperty);
            }
            set
            {
                SetValue(TheContentProperty, value);
            }
        }

        public static readonly DependencyProperty TheContentProperty =
            DependencyProperty.Register("TheContent", typeof(string), typeof(BaseDataType),
            new FrameworkPropertyMetadata());


        public int TheWidth
        {
            get
            {
                return (int)GetValue(TheWidthProperty);
            }
            set
            {
                SetValue(TheWidthProperty, value);
            }
        }

        public static readonly DependencyProperty TheWidthProperty =
            DependencyProperty.Register("TheWidth", typeof(int), typeof(DataTypeWholeNumber),
            new FrameworkPropertyMetadata());



    }
}

Ответы [ 5 ]

117 голосов
/ 20 мая 2009

Убедитесь, что вы изменили первый тег в xaml, чтобы также наследовать от вашего нового базового типа

Так

<UserControl x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    >

становится

<myTypes:BaseDataType x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    xmlns:myTypes="clr-namespace:TestDependencyProperty827.DataTypes"
    >

Итак, чтобы подвести итог полного ответа, включая дополнительные детали из комментариев ниже:

  • Базовый класс не должен включать файл xaml. Определите его в одном (не частичном) файле cs и определите его для наследования непосредственно из Usercontrol.
  • Убедитесь, что подкласс наследует от базового класса как в файле с выделенным кодом cs, так и в первом теге xaml (как показано выше).
2 голосов
/ 31 января 2014
public partial class MooringConfigurator : MooringLineConfigurator
    {
        public MooringConfigurator()
        {
            InitializeComponent();
        }
    }



<dst:MooringLineConfigurator x:Class="Wave.Dashboards.Instruments.ConfiguratorViews.DST.MooringConfigurator"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:dst="clr-namespace:Wave.Dashboards.Instruments.ConfiguratorViews.DST"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">

    </Grid>
</dst:MooringLineConfigurator>    
1 голос
/ 31 января 2012

Я нашел ответ в этой статье: http://www.paulstovell.com/xmlnsdefinition

По сути, это означает, что вы должны определить пространство имен XML в файле AssemlyInfo.cs, которое можно использовать в XAML. Это сработало для меня, однако я поместил базовый класс управления пользователем в отдельную DLL ...

0 голосов
/ 10 сентября 2015

Существует частичное определение класса, созданное дизайнером, его можно легко открыть с помощью определения метода InitializeComponent (). Затем просто измените частичное наследование класса с UserControl на BaseDataType (или любой, указанный вами в определении класса).

После этого вы получите предупреждение о том, что метод InitializeComponent () скрыт в дочернем классе.

Поэтому вы можете сделать CustomControl в качестве базовых классов вместо UserControl, чтобы избежать частичного определения в базовом классе (как описано в одном комментарии).

0 голосов
/ 12 сентября 2013

Я столкнулся с той же проблемой, но мне нужно, чтобы элемент управления наследовал от абстрактного класса, который не поддерживается разработчиком. Что решило мою проблему, так это заставив usercontrol наследоваться как от стандартного класса (который наследует UserControl), так и от интерфейса. Так работает дизайнер.

//the xaml
<local:EcranFiche x:Class="VLEva.SIFEval.Ecrans.UC_BatimentAgricole" 
                  xmlns:local="clr-namespace:VLEva.SIFEval.Ecrans"
                  ...>
    ...
</local:EcranFiche>

// the usercontrol code behind
public partial class UC_BatimentAgricole : EcranFiche, IEcranFiche
{
    ...
}

// the interface
public interface IEcranFiche
{
   ...
}

// base class containing common implemented methods
public class EcranFiche : UserControl
{
    ... (ex: common interface implementation)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...