Сериализация в WPF (События)?

Я сериализирую свой 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);
}
}



Но все равно после десериализации не работают обработчики.


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

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;


Что не так? Можно ли сделать, чтобы события после десериализации работали?

p.s. Знакомый попросил выспросить — аккаунта нету у него.
  • Вопрос задан
  • 3352 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы