В настоящее время я работаю над редактором, таким как приложение WPF, в котором вы можете отредактировать элемент управления, а затем открывается диалоговое окно с копией элемента управления в нем.Для копирования элемента управления я использую XamlReader.Parse(string)
и XamlWriter.Save(obj)
.
Теперь есть некоторые (пользовательские) элементы управления, которые содержат элемент управления Image, для которого Source
имеет значение WriteableBitmap
.Растровое изображение не сериализуемо, поэтому сериализатор выдает некоторые исключения, но это не главная проблема, потому что сериализацию не требуется, потому что она все равно будет изменена позже.
Есть ли способ сериализации WPF-Control и прикажите Сериализатору игнорировать свойство его дочерних элементов или переопределить его чем-нибудь сериализуемым (например, null ) во время выполнения ?
Я уже пытался вручную установить свойство источника до и после сериализации, но по какой-то неизвестной причине я не могу изменить источник десериализованного элемента управления.
Код длядиалоговое окно
public void LaunchEditor()
{
Editor dlg = new Editor ();
dlg.Owner = Application.Current.MainWindow;
dlg.SetTemplateString(XamlWriter.Save(this));
if (dlg.ShowDialog() ?? false)
{
string s = dlg.GetTemplateString();
CustomControlType c = (CustomControlType)XamlReader.Parse(s);
Content = c;
}
}
код для сериализации
public void SetTemplateString(string template)
{
Placeholder = (CustomControlType)XamlReader.Parse(template);
/*Formatting Stuff*/
}
public string GetTemplateString()
{
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings()
{
Indent = true
};
XmlWriter writer = XmlWriter.Create(sb,settings);
XamlDesignerSerializationManager mgr = new XamlDesignerSerializationManager(writer);
XamlWriter.Save(Placeholder, mgr);
return sb.ToString();
}
Пользовательский элемент управления, содержащий изображение
public partial class RollingViewControl : ContentConstrol
{
private RollingBitmap _bmp;
public RollingViewControl()
{
_bmp = new RollingBitmap(256, 256);
InitializeComponent();
ImageDisplay.Source = _bmp.Bitmap;
}
}
RollingBitmap
- это класс для манипулирования WriteableBitmap
, который является свойством этого класса.
Проблема заключается в свойстве Source элемента управления изображением, когда сериализация элемента управления Source также получает сериюalized.Поскольку это предварительно скомпилированный код, я не могу установить какие-либо атрибуты и не нашел способа применить XmlAttributeOverrides
к XamlWriter
.