Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > WPF - user control trouble


Автор: Kefir 17.8.2007, 10:26
Привет! И снова я со своими юзерконтролами.

Система загрузки: Core.cs ищет плагины в определённой директории. Затем на окне можно выбрать плагин и нажать "Run plugin":
Код

        private void buttonRun_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            IPlugin selectedPlugin = (IPlugin)this.listBoxPlugins.SelectedItem;
            selectedPlugin.Reset();
            
            TabItem ti = new TabItem();
            ti.Style = (Style)this.FindResource("SimpleTabItem");

            ti.Tag = selectedPlugin.Name;
            ti.Header = selectedPlugin.Name;
            ti.Content = null;
            ti.Content = selectedPlugin.UIObject;

            this.tabControl.Items.Add(ti);
            this.tabControl.SelectedIndex++;
        }

как видно из кода - плагины имеют свой UIObject, который и показывается юзеру. с одним плагином возникла проблема. при нажатии на "Run plugin" он выдаёт исключение:
Цитата

Message="The component 'PluginERDCatalogueUI.CatalogueViewer' does not have a resource identified by the URI '/PluginERDCatalogueUI;component/catalogueviewer.xaml'."
Source="PresentationFramework"

я, честно говоря, не понимаю к чему бы это. плагин PluginERDCatalogue берёт контрол CatalogueViewer из сборки PluginERDCatalogueUI. и на ините тупо делает this._CatalogueViewer = new CatalogueViewer(); всё. это и есть UIObject плагина.
также стоит отметить, что если создать WPF приложение и туда подключить PluginERDCatalogueUI напрямую, поставить в окно CatalogueViewer, то всё работает прекрасно. Я просто никак не могу понять что от меня хотят этим эксепшном. Опять же - гугл молчит как партизан (не совсем, конечно, но молчит)

Автор: ivashkanet 17.8.2007, 10:57
Kefir, надеюсь, такого ты не видел:
http://geekswithblogs.net/lbugnion/archive/2007/03/07/108214.aspx
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1746994&SiteID=1

smile

Автор: Kefir 17.8.2007, 11:08
по первой ссылке - видел, странное решение. на всякий случай таки проверил shadow copy - оно отключено.
по второй ссылке - тоже видел. сидел с час, пытался понять, что же хотели сказать авторы постов и что мне надо покурить чтобы понять смысл их слов. насколько я в целом понял - речь о том, что если в сборке А у меня есть класс MyClass, наследующий от какого-то класса BaseClass, то в сборке Б я не смогу ничего унаследовать от класса MyClass. если да, то, по-моему, это ко мне не относится. У меня есть сборки MainApp, Plugin, PluginUI. в PluginUI есть класс UI : UserControl, в Plugin есть класс Plugin : IPlugin, который содержит pluginUI = new UI(); то есть у меня никаких наследований, описанных в той теме. вообще, я уже искал на мсдн, live.com и гугле. Всё что там по этому поводу есть - прочитано и перечитано. Так что сейчас я надеюсь лишь на знания форумчан, а не на поисковики.

Автор: Kefir 17.8.2007, 11:38
так. методом тыка вроде даже устранил. в PluginERDCatalogueUI было два элеметна - один это сам контрол CatalogueViewer и был интерфейс ICatalogueItem. так вот если удалить этот самый интерфейс, то всё прекрасно получается.... не понимаю почему так происходит, но без него всё идёт как по маслу...

Автор: Exception 17.8.2007, 12:58
Во-первых, установи Build Action для твоего CatalogueViewer.xaml в Page (и вообще, поэкспериментируй с ним). Во-вторых, посмотри код внутри CatalogueViewer.InitializeComponent (). Он должен выглядеть так:
Код
public void InitializeComponent ()
{
    if (_contentLoaded)
    {
        return;
    }
    _contentLoaded = true;
    System.Uri resourceLocator = new System.Uri ("CatalogueViewer.baml", System.UriKind.RelativeOrAbsolute);
    System.Windows.Application.LoadComponent (this, resourceLocator);
}
Навеяно http://blog.voidnish.com/?p=126 и http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1746994&SiteID=1.

Автор: namespace 17.2.2010, 16:58
Цитата(Kefir @ 17.8.2007,  11:08)
... если в сборке А у меня есть класс MyClass, наследующий от какого-то класса BaseClass, то в сборке Б я не смогу ничего унаследовать от класса MyClass.

неужто нет решения этой проблемы? как же быть копипастить?


P.S. народ говорит есть два варианта:
           1. вместо наследования сделать композицию
           2. MyClass сделать code behind

Автор: namespace 17.2.2010, 18:41
подтверждаю code behind работает, на том и остановился...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)