Модераторы: gambit, Kefir, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xaml как ресурс с обработкой событий 
V
    Опции темы
RastaDja
Дата 30.7.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



   Доброго времени суток уважаемые форумчане!
   Есть у меня проект, в котором нужна генерация формы на лету, тоесть в зависимости от задачи.
   Эту задачу я думаю решить используя загрузку окна из XAML файла.

   Сейчас я описал такой класс
Код

namespace Task
{
    class Task
    {
        Window win;
        public Task()
        {
            win = new Window();
            FileStream s = new FileStream("D:\\Task.xml", FileMode.Open);
            DependencyObject rootElement = (DependencyObject)XamlReader.Load(s);
            win = (Window)rootElement;
            win.Show();
        }
    }
}

    В файл "D:\\Task.xml" записал такой код
Код

<Window x:Class="System.Windows.Window"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
      <StackPanel>
        <Button Name="mbtn" Content="click me" Click="Button_Click"></Button>
      </StackPanel>
    </Grid>
    <x:Code>
      <![CDATA[
      public void Button_Click(object sender, RoutedEventArgs e)
      {
        MessageBox.Show("you clicket button");
      }
      ]]>
    </x:Code>
</Window>

   В строке (смотрите первый код) DependencyObject rootElement = (DependencyObject)XamlReader.Load(s); получаю такую ошибку:
"Не удалось создать "Click" на основе текста "Button_Click".": номер строки "7" и позиция в строке "48".

Подскажите как правильно все сделать, буду весьма признателен.


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 1.8.2011, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Судя по всему - так сделать не получится.
Надо делать, наверное, через BAML.
Подскажите, как создать BAML файл, чтоб правильно были указаны все теги, в частности x:Class.


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Kefir
Дата 1.8.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



Почитай вот тут: http://msdn.microsoft.com/en-us/library/cc...6(v=vs.95).aspx

В частности часть:
Цитата

XAML for Load should not attempt to specify x:Class, or include any XAML-defined attributes for event handlers. Load logic cannot integrate the loaded XAML with code-behind classes at runtime. If you want to add event handlers, you must do so in code by referencing objects obtained from within the object tree structure of the Load result, and using language-specific syntax for attaching handlers (such as +=). For more information, see Events Overview for Silverlight.

PM MAIL WWW Skype   Вверх
RastaDja
Дата 1.8.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Kefir, следуя из выше указанного, я не могу использовать код в XAML. Это очень плохо, ведь я заранее не знаю сколько и каких элементов управление будет на форме, а ещё хуже - не знаю, какие действия надо сделать при нажатии на эти элементы.
А есть ли у вас ответ на второй вопрос? 
Цитата(RastaDja @  1.8.2011,  10:28 Найти цитируемый пост)
Подскажите, как создать BAML файл

Спассибо


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
jonie
Дата 1.8.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 2
Всего: 118



Цитата(RastaDja @  1.8.2011,  10:52 Найти цитируемый пост)
Kefir, следуя из выше указанного, я не могу использовать код в XAML. Это очень плохо, ведь я заранее не знаю сколько и каких элементов управление будет на форме, а ещё хуже - не знаю, какие действия надо сделать при нажатии на эти элементы.

зато есть всякие IronPython-ы ...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
RastaDja
Дата 1.8.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Видимо BAML можно юзать только из ресурсов. Или я не прав?
   Блин, придумал велосипед:
      1. Создать XML вида
Код

<Global>
   <XAML>
       <Grid>
            <Button Name="button1">Click me</Button>
       </Grid>
   </XAML>
   <CODE>
        <button1>                   <!-- Обработка кнопки по имени -->
              <[CDATA[
                     dim a = 100
                     msgbox a
              ]]>
        </button1>
   </CODE>
</Global>

   Но ведь это же явное извращение. Как тогда работать с листом, со списком, текст боксом?... Ума не приложу. Может кто уже столкнулся с таким заданием. Посоветуйте умное решение.

Добавлено @ 11:28
Цитата(jonie @  1.8.2011,  12:10 Найти цитируемый пост)
зато есть всякие IronPython-ы ... 

Спасибо за совет, сейчас почитаю.

Это сообщение отредактировал(а) RastaDja - 1.8.2011, 12:54


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Rohoss
Дата 1.8.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



RastaDja, я думаю подход в корню не правильный. Зачем тебе BAML, ты храни окна в сборках *.dll и их загружай.

Это сообщение отредактировал(а) Rohoss - 1.8.2011, 13:49


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
RastaDja
Дата 1.8.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(Rohoss @  1.8.2011,  14:47 Найти цитируемый пост)
Зачем тебе BAML, ты храни окна в сборках *.dll и их загружай.

Rohoss, хм. Никогда такое не делал. Можно пример?

   А вообще-то поясню что надо сделать: Нужно чтоб приложение просканировало указанную папку, из этой папки взяло имена файлов, из этих имен построило список, и вот когда мы нажмем на нужный элемент списка (тоесть выберем файл) и из этого файла построится нужный нам интерфейс. Мало того, этот интерфейс должен реагировать на юзание элементов в нем. А главное - это то, чтоб можна было таких интерфейсов создать много, и чтоб это было легко. Вот почему я выбрал модель построения, которую описал в начале темы.
   Жаль что Майкрософт не реализовала эту возможность

   Тоесть я хочу оперировать таким кодом
Код


<Window Name="MainWin" x:Class="WpfAmp.newresearch"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="newresearch" Height="320" Width="640">
    <Grid Name="ContentGrid">
        <DockPanel>
            <StackPanel DockPanel.Dock="Top">
                <WrapPanel Margin="3">
                    <Label Content="Код пробы"></Label>
                    <TextBox MinWidth="200" Name="Name"></TextBox>
                    <Label Content="Масса"></Label>
                    <TextBox MinWidth="200" Name="Rn"></TextBox>
                </WrapPanel>
                <WrapPanel Margin="3">
                    <Label Content="Название"></Label>
                    <TextBox MinWidth="200"></TextBox>
                    <Label Content="Длина" ></Label>
                    <TextBox MinWidth="200" Name="Len"></TextBox>
                </WrapPanel>
                
            </StackPanel>
            <StackPanel  DockPanel.Dock="Bottom">
                <WrapPanel>
                    <Button Content="Сохранить" Click="Clicked"></Button>
                    <Button Content="Итмена"></Button>
                </WrapPanel>
            </StackPanel>
        </DockPanel>
        
        <x:Code>
            <![CDATA[
                void Clicked(object sender, RoutedEventArgs e)
                {
                      button1.Content = "Hello World";
                      int a = Name.Text + Len.Text;
                      //сохраняем данные на диск, или другое действие
                }
             ]]>
        </x:Code>
    </Grid>
</Window>


если компиляция в длл позволит такое сделать, тогда все ок.
Относительно IronPython IronRuby, это мне напоминает MSScript, хотя может я ещё не увидел различий

Это сообщение отредактировал(а) RastaDja - 1.8.2011, 14:21


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
hexzo
Дата 1.8.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



RastaDja Случайно не оно, там вроде что-то про чтение ксамла из файла.
 http://msdn.microsoft.com/en-us/library/cc...4(v=vs.95).aspx

Это сообщение отредактировал(а) hexzo - 1.8.2011, 14:46
PM MAIL   Вверх
Rohoss
Дата 1.8.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



RastaDja, пример может быть чуть позже. Вообще, ты ошибаешься что майкрософт такое не реализовали, смотри MEF


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
RastaDja
Дата 1.8.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(Rohoss @  1.8.2011,  15:52 Найти цитируемый пост)
Вообще, ты ошибаешься что майкрософт такое не реализовали

   Тут я имею ввиду, что майкрософт не реализовали использование тега <x:Code> при динамической загрузке XAML. А такая реализация - это очень нужная, на мой взгляд, вещь.
Цитата(Rohoss @  1.8.2011,  15:52 Найти цитируемый пост)
смотри MEF

   Смотрю. Пока ещё не понял чем это поможет мне в моей задачи. Может туплю, это факт, но всеравно не понимаю.
Цитата(Rohoss @  1.8.2011,  15:52 Найти цитируемый пост)
RastaDja, пример может быть чуть позже.

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


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Rohoss
Дата 1.8.2011, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Создаём одну сборку, в которой будут вызываться окна с dll, и создаём саму dll, в которой потом создаём окно.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  WpfApp.zip 86,76 Kb


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Rohoss
Дата 1.8.2011, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Только учти, я набросал быстро, абы как. но думаю смысл должен быть понятен 

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  WpfApp.zip 86,76 Kb


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
RastaDja
Дата 1.8.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(hexzo @  1.8.2011,  15:45 Найти цитируемый пост)
RastaDja Случайно не оно, там вроде что-то про чтение ксамла из файла.
 http://msdn.microsoft.com/en-us/library/cc...4(v=vs.95).aspx

это я уже сделал, в топике мой код аналогичен.

Rohoss спасибо за сборку (+). Утром на Работе посмотрю. Если будут вопросы обращусь ещё))


Это сообщение отредактировал(а) RastaDja - 1.8.2011, 23:19


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 2.8.2011, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Rohoss, ваш пример хороший, но он действует внутри сборки. Как подключать модули не зная имен типов внутри модуля - это не понятно. К тому-же, не хочется перекомпилировать сборку каждый раз, и под каждого закажкика, когда нужно добавить одно или два окна. Все-таки хочится делать все попроще. Раньше для этого была написано скрипт машина, с прописаными заранее функциями и т.д.
   Сейчас ее возможностей маловато, хочется писать программы под современный интерфейс используя WPF, в тоже время хочется быстро редактировать окно, или часть окна (некоторые части будут загружатся внутрь окна главного приложения). Хотелось бы открыть блокнот, набрать за 30-40минут код, и вуа-ля. Как-то не хочется велосипедить со скрипт машиной, не важно что это Shell, Python, VBScript или что-то другое.. Но видимо придется.
   Ваша идея действительно хорошая, но как это сделать для любой ДЛЛ, не только из сборки, и к тому-же - это уже скомпилированный файл, который нет возможности поправить (заменить int a=2 На int a=3 например, не получится).

Это сообщение отредактировал(а) RastaDja - 2.8.2011, 20:31


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0955 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.