WPF - наследование UserControl - PullRequest
       5

WPF - наследование UserControl

5 голосов
/ 21 октября 2010

У меня проблема с управлением наследованием в WPF.Я создал UserControl с именем BaseUserControl.Я хочу, чтобы этот элемент управления был базовым элементом управления для других пользовательских элементов управления WPF.Поэтому я написал еще один UserControl под названием FirstComponent.На следующем шаге я изменил этот код

FirstComponent : UserControl

на этот

FirstComponent : BaseControl

Однако во время компиляции я получаю эту ошибку

Partial declarations of 'controlinheritance.componenets.FirstComponent' must not specify different base classes 

Что я должен сделать, чтобы включить FirstComponentполучить из BaseControl?

EDIT Благодаря ответу abhishek мне удалось унаследовать элементы управления.Но у меня есть еще один вопрос.В базовом классе я указал свойство public Grid _MainGrid {get;задавать;}.Теперь я хочу в своем производном классе создать экземпляр этой сетки.Поэтому я использовал этот код, но я получаю сообщение об ошибке. Свойство '_MainGrid' не имеет значения.Строка 8, Позиция 36.

Ответы [ 3 ]

5 голосов
/ 21 октября 2010

Вы видели мою полную статью об этом?

http://www.dotnetfunda.com/articles/article832-define-base-class-for-window--usercontrol-.aspx

Надеюсь, это поможет вам в этом.

Если вы попытаетесь выполнить проект, он обязательно выдаст вам ошибку.Это потому, что каждое окно WPF создается из макета baseWindow, а не из текущего макета окна.Другими словами, если вы видите XAML, вы увидите, что корневым тегом является Window, который является просто родительским классом текущего окна.

Таким образом, чтобы все работало идеально, нам нужно изменить корневой элемент.

Таким образом, это выглядело бы так:

<local:BaseWindow Class="BaseWindowSample.Window1" 
                  Name="winImp" 
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                  x="http://schemas.microsoft.com/winfx/2006/xaml" 
                  xmlns:local="clr-namespace:BaseWindowSample" 
                  Title="Window1">
...
</local:BaseWindow>

Если вы видите это подробно, вы можете видеть, что я добавил одно пространство имен в свой проект и назвал его локальным.Таким образом, BaseWindow должен исходить из BaseWindow и, таким образом, он выглядит как локальный: BaseWindow

0 голосов
/ 14 февраля 2014

Когда вы указываете Другой базовый класс для Usercontrol в файле XAML.cs

 FirstComponent : BaseControl

Вы также должны изменить это в XAML

 <Base:BaseControl x:Class="FirstComponent"
             xmlns:Base="clr-namespace:MyApplication.Base"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>


    </Grid>
</Base:BaseControl>
0 голосов
/ 14 февраля 2014

Ну, причина первоначальной ошибки была в том, что класс был на самом деле частичным классом, который перечислял конкретное базовое наследование где-то еще в дополнение к месту, где вы изменили свой базовый класс.

Что касается вашего свойства 'наследование', я предлагаю попробовать

public Grid MainGrid 
{ 
   get 
   { 
      return base.MainGrid; 
   } 

   set 
   { 
      base.MainGrid = value; 
   } 
}

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

public Grid MainGrid
{
    get
    {
        return BaseControl.MainGrid;
    }

    set
    {
        BaseControl.MainGrid = value;
    }
}
...