Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Сериализация, объясните одну функцию


Автор: DenWPF 4.9.2010, 13:12
Я сериализую richtextbox по статье http://www.gotdotnet.ru/blogs/Vitiy/6547/
но вот там появляется 
Код

FlowDocument deserializedXaml = ParseXAML(s, true);

и описания его нет.
что происходит в нутри этой функции. 

мой сериализированный текст 

Код

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:auc="clr-namespace:Adminka.UserControls;assembly=Adminka">
    <Paragraph>
        <InlineUIContainer BaselineAlignment="Bottom">
            <auc:MusicControl Path_file="E:\редактор\WPFRichEditorLibrary_0.0.0.6_src\WPFRichEditorLibrary\WordPadTestApp\WordPadTestApp\sound\read.wav">
                <Border>
                    <DockPanel LastChildFill="False">
                        <Button Name="play" VerticalAlignment="Top">Play</Button> 
                        <Button Name="stop" VerticalAlignment="Top">Stop</Button> 
                    </DockPanel>
                </Border>
            </auc:MusicControl>
        </InlineUIContainer>
    </Paragraph>
</FlowDocument>

Автор: jonie 4.9.2010, 13:23
XamlReader.Load надо пологать...

Автор: DenWPF 4.9.2010, 15:44
он возращает обжект.

я думаю там переопределение той функции,  так как там же есть и мои не стандартные элементы

ошибка - "No matching constructor found on type 'Adminka.UserControls.MusicControl'. You can use the Arguments or FactoryMethod directives to construct this type"

Adminka.UserControls.MusicControl - это именно мой контрол, пишут через аргументы или FactoryMethod - кто что об этом знает?

Автор: WolfTheGrey 4.9.2010, 21:43
правельно он тебе пишет.
Там же еще и кнопки, А с этими контролами ты что ни будь делал?

Автор: DenWPF 4.9.2010, 21:45
нет, не чего не делал.. я не могу понять где с ними что то сдеалть надо...
я понимаю что надо их определить но где и как х3.

Автор: WolfTheGrey 4.9.2010, 22:56
попробуй в ручную, перебрать весь документ и все кнопки сериализовать отдельно.

Автор: DenWPF 4.9.2010, 23:35
так сериализует он правельно.

Код

<auc:MusicControl Path_file="E:\редактор\WPFRichEditorLibrary_0.0.0.6_src\WPFRichEditorLibrary\WordPadTestApp\WordPadTestApp\sound\read.wav">
                <Border>
                    <DockPanel LastChildFill="False">
                        <Button Name="play" VerticalAlignment="Top">Play</Button> 
                        <Button Name="stop" VerticalAlignment="Top">Stop</Button> 
                    </DockPanel>
                </Border>
            </auc:MusicControl>


я думаю есть же метод в который можно добавить что делать с этими данными если они встретяться...
но где?


Автор: DenWPF 7.9.2010, 16:07
не кто не знает?

Автор: DenWPF 9.9.2010, 18:22

Я сериализирую свой usercontrol в richtextbox WPF.
С стандартными элементами все хорошо, а вот со своим контролом трабл.
Не сериализируются События, что и сказано в MSDN 
Цитата

Обработка событий не сохраняется

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


Я попробовал через выделенный  код

Получилось так:
(это мой контрол)
Код

        <DockPanel LastChildFill="False">

            <Button x:Name="play" Click="play_Click" VerticalAlignment="Top" Content="Play"/>
            <Button x:Name="stop" Click="stop_Click" VerticalAlignment="Top" Content="Stop"/>
            <x:Code>
                <![CDATA[
        public void play_Click(object sender, RoutedEventArgs e)
        {
            me.Stop();
            me.Play();
        }

        public void stop_Click(object sender, RoutedEventArgs e)
        {
            me.Stop();
        }
  ]]>
            </x:Code>
        </DockPanel>



а в коде так:

Код

       public MusicControl() 
        {
            InitializeComponent();
            play.Click += new RoutedEventHandler(play_Click);// тут при десериализации не ругается
            stop.Click += new RoutedEventHandler(stop_Click);
           
            me.LoadedBehavior = MediaState.Manual;
            me.UnloadedBehavior = MediaState.Manual;
        }
        public MusicControl(string path_file)
        {
            this.path_file = path_file;
            me.LoadedBehavior = MediaState.Manual;
            me.UnloadedBehavior = MediaState.Manual;
            try
            {
                me.Source = new Uri(path_file);
            }
            catch { }

            InitializeComponent();

            play.Click += new RoutedEventHandler(play_Click);
            stop.Click += new RoutedEventHandler(stop_Click);
        }

        MediaElement me = new MediaElement();
        string path_file = "";

        public string Path_file
        {
            get { return path_file; }
            set 
            { 
                path_file = value;
                me.Source = new Uri(Path_file);
            }
        }



но все равно после десериализации не пашет обработчики =(

сама сериализация\десериализация:

Код

          //FlowDocument fd
        
            string aaa = XamlWriter.Save(fd);

            rtf.RichTextControl.Document.Blocks.Clear();

            byte[] byteArray = Encoding.ASCII.GetBytes(aaa);
            MemoryStream stream = new MemoryStream(byteArray);
            
            object ddd = XamlReader.Parse(aaa);
            FlowDocument deserializedXaml = ddd as FlowDocument;


помогите.

Автор: WolfTheGrey 13.9.2010, 12:16
обработчики и не будут похать так как после пропускания через XamlWriter они отлитают. Это сделано для того, если попадет контрол в форму не поддерживаюшую этот обработчик ,чтоб форма не слитела короч. Надо вручную обработчик прикручивать.
Эта тема уже обсуждалась гдето зимой.

Автор: DenWPF 13.9.2010, 17:52
так посмотри, я их руками прикручиваю...
и при этом они как раз не ругаются...но и не работают=(

Автор: WolfTheGrey 27.9.2010, 00:58
еще можно команды прикрутить.
Жаль поздно про них вспомнил :(

Автор: DenWPF 27.9.2010, 10:13
а команды сериализуются?

Автор: WolfTheGrey 27.9.2010, 13:53
если память не изменяет то да. 
Вообще ты читал строчку, которая получается после сериализации?
Код

FlowDocument fd        
 string aaa = XamlWriter.Save(fd);


там будет описание всех использованых свойств всех контролов в виде XML разметки (тоько в одну строчку)

Автор: DenWPF 27.9.2010, 19:02
конечно считал, блин просто я с командами так и не смог разобраться=(

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