Visual Studio перезаписывает родительский элемент UserControl, если не наследуется System.Windows.Controls.UserControl - PullRequest
1 голос
/ 30 октября 2009

Я создаю серию UserControls, которые имеют похожую бизнес-логику. Поэтому я попытался реализовать эту общую бизнес-логику в абстрактном базовом классе, от которого наследуются все эти пользовательские элементы управления. Цепочка наследования выглядит примерно так:

System.Windows.Controls.UserControl <- MyControlBase (abstract) <- MyControl1, MyControl2 и т. Д. </p>

Я создал классы MyControl1, MyControl2 и т. Д. В качестве пользовательских элементов управления в Visual Studio. Я установил классы для наследования от MyControlBase вместо System.Windows.Controls.UserControl. Это прекрасно работает ... пока я не внесу изменения в XAML и не сохраню заново. Затем Visual Studio 2008 переназначает сгенерированный класс для наследования от System.Windows.Controls.UserControl.

Пример кода классов и XAML:

// MyControlBase.cs:

    public abstract class MyControlBase.Windows.Controls.UserControl
    {
       public abstract void DoOperation1();
    }

// MyControlBase.xaml: none

// MyControl1.cs:

    public partial class MyControl1: MyControlBase
    {
        public MyControl1()
        {
            InitializeComponent();
        }
        public override void DoOperation1()
        {
           return;
        }
    }

// MyControl1.xaml:

    <UserControl x:Class="Test.Controls.BarChart"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Grid x:Name="LayoutRoot" Background="Blue">

        </Grid>
    </UserControl>

// mycontrol1.g.cs (generated by Visual Studio) orginally

    public partial class MyControl1: System.Windows.Controls.UserControl
    {

        internal System.Windows.Controls.Grid LayoutRoot;

        // InitilizeComponent() etc

    }

// mycontrol1.g.cs (generated by Visual Studio) modified by me

public partial class MyControl1: MyControlBase
    {

        internal System.Windows.Controls.Grid LayoutRoot;

        // InitilizeComponent() etc
    }

При каждом редактировании MyControl1.xaml в редакторе Visual Studio 2008 после его сохранения измененный файл mycontrol1.g.cs продолжает возвращаться к исходному (именуемо: снова наследуется от System.Windows.Controls.UserControl). Затем компиляция завершается неудачно, потому что два частичных класса MyControl1 не наследуются от одного и того же родителя: сгенерированный VS наследует от System.Windows.Controls.UserControl, мой код от MyControlBase.

Есть ли способ обойти эту проблему? Я хотел бы иметь возможность наследовать от абстрактного класса и предположить, что Visual Studio может дать мне возможность, я просто не вижу, что мне не хватает. Или концепция UserControl, наследуемая от другого класса, отличного от System.Windows.Controls.UserControl, является плохой концепцией?

1 Ответ

1 голос
/ 30 октября 2009

Вам нужно изменить xaml для наследования от MyControlBase вместо UserControl:

<my:MyControlBase
  xmlns:my="MyNamespace"
  x:Class="Visiblox.Charts.Test.Controls.BarChart"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <Grid x:Name="LayoutRoot" Background="Blue">
   </Grid>
</my:MyControlBase>

Именно поэтому Visual Studio продолжает изменять базовый класс при редактировании xaml.

...