2013-07-16 5 views
0

Я исследовал это довольно тщательно и нашел this, this и this. Все страницы справки, которые я нашел, говорят почти то же самое. Это не очень сложно, поэтому я уверен, что сделал все правильно, но файлы за кулисами все запутались или что-то в этом роде. Появляется любая из следующих трех ошибок, и только ошибки 1 и 2 не позволяют ей работать.Как создать пользовательские классы XAML и CS с наследованием?

Ошибка 1: Если XAML файлы открыты в редакторе, когда я запускаю его, то ошибка только на этот файл: Название «Вариант» не существует в пространстве имен «CLR-имена: Addin»

ошибка 2: Если XAML-файлы не открываются в редакторе, когда я запускаю его, то ошибка: имя типа «Вариант» не существует в типе «Addin.Addin». ... во всех файлах g.cs.

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

Как будто VS убежден, что класс не существует, но он действительно заботится только о наследовании.

Достаточно сказать, что я смущен, и любое понимание относительно того, что может быть неправильным, будет с благодарностью оценено. Кроме того, я использую VS 2012 Professional, что некоторые из моих коллег, кажется, думают, что виновник, по крайней мере ошибок 3.

EAC1O1.xaml.cs

namespace Addin 
{ 
    public partial class EAC1O1 : Option 
    { 
     public EAC1O1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Option.cs

namespace Addin 
{ 
    public abstract class Option : UserControl 
    { 

EAC1O1.xaml

<local:Option x:Class="Addin.EAC1O1" 
      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" 
       xmlns:local="clr-namespace:Addin" 
      mc:Ignorable="d" > 
    <DockPanel> 

    </DockPanel> 
</local:Option> 

EAC1O1.g.cs

namespace Addin{ 


    /// <summary> 
    /// EAC1O1 
    /// </summary> 
    public partial class EAC1O1 : Addin.Option, System.Windows.Markup.IComponentConnector { 
+0

OMG Что вы пытаетесь сделать? О.O –

+0

.cs и .xaml, которые унаследованы от абстрактного класса Option (который имеет много свойств и методов, которые применяются к тем классам, которые их реализуют), но сами по себе НЕОБХОДИМО быть в разных файлах, поскольку они очень разные и сложные GUI, с опцией, унаследованной от UserControl. Просто на самом деле. :) – unwrittenrainbow

+0

Чувак, вы ставите логику и функциональность в представлении, где она не принадлежит. Пожалуйста, покажите, что вы пытаетесь достичь здесь, и я могу сказать вам правильный способ сделать это в WPF. –

ответ

0

EDIT: Psych, его не ошибка. (Ну, он может использовать некоторые дополнительные функции, чтобы избежать этого.) У меня был класс с именем те же, что и пространство имен. Это никогда ничего не нарушало, и оно не выдавало никаких предупреждений, поэтому я не понимал, что это не так. Изменение имени класса исправило все. VS должен действительно бросить предупреждение, если вы сделаете это, чтобы вы знали, что это может сломать вещи.

Решение оказалось ошибкой в ​​Visual Studio 2012. Я показал это двумя способами.

Первый метод: Я разделил класс Option на другую сборку (библиотеку классов), и теперь она прекрасно работает точно так же, как написано, просто меняя пространства имен.

Метод второй: Колейг создал тот же проект в MS VS 2010, и он отлично работал.

MS VS BUG # 794312

0

Вы можете попробовать сделать свою базу Option класс не абстрактно. Части дизайнера полагаются на возможность создания экземпляра класса и/или базового класса, используемого в тегах XAML.

+0

Это хорошая мысль, но нет буено. Никаких изменений в поведении вообще. Я потерял дизайнера некоторое время назад, и это не мое главное беспокойство. Каждый из экземпляров класса Option может быть создан как фиктивный UserControl, а затем скопирован/вставлен в соответствующие файлы .xaml/.cs. – unwrittenrainbow