Как сделать глубокую копию элемента UIElement? - PullRequest
4 голосов
/ 25 мая 2011

Итак, у меня есть компонент печати, который обслуживает приложение Silverlight. Другие модули в этой программе имеют возможность сигнализировать компоненту печати и передавать его UIElement, который компонент печати затем отобразит на экране. Все хорошо. Проблема возникает, когда я пытаюсь манипулировать элементом пользовательского интерфейса, чтобы лучше отформатировать его в соответствии с выбранным пользователем размером бумаги или чем-либо в этом роде; кажется, что переданный элемент пользовательского интерфейса часто является точно таким же экземпляром на экране, и элемент экрана изменяется сам, чтобы соответствовать изменениям «только для печати», которые я сделал. На данный момент я могу вручную сохранить предыдущие значения, внести свои изменения и восстановить предыдущие значения, но было бы проще / более надежным / более эффективным / более гибким, если бы у меня был способ, учитывая элемент пользовательского интерфейса, сделать копию элемента, и манипулируйте этим свободно, не беспокоясь об изменениях или состоянии исходного элемента интерфейса. Как можно программно скопировать экземпляр элемента пользовательского интерфейса, чтобы у меня был другой экземпляр с таким же визуальным видом?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Я знаю 2 способа, которыми вы можете попробовать:

Сохранение объекта в строку xaml и воссоздание его из него. (XamlWriter.Save и XamlReader.Parse)

Сохраните объект с сериализатором в потоке памяти и воссоздайте его из этого - возможно, не все объекты помечены как сериализуемые, так что может использоваться другой вариант.

Это может показаться немного сложным - но способов создания глубокой копии не так уж и много - и не существует какого-либо стандартного метода c #, который я знаю.

1 голос
/ 06 июня 2011

Если вы уже столкнулись с проблемой ручного сохранения предыдущих значений, похоже, вы достаточно близки к тому, чтобы просто создать новый экземпляр объекта и установить его свойства.

Если элемент пользовательского интерфейсапомечен как сериализуемый, вы можете довольно легко клонировать объект.

...