Как отобразить элемент управления XAML с привязкой к данным в собственный чертеж XAML
У меня есть связанный с данными элемент управления XAML, например:
<UserControl>
<TextBlock Text="{Binding Text}" />
</UserControl>
и хотите, чтобы он выглядел как рисунок:
<UserControl>
<TextBlock Text="Actual text value" />
</UserControl>
Кто-нибудь знает, как извлечь рисунок из произвольного элемента управления?
ОБНОВЛЕНИЕ: Этот вопрос, кажется, не ясен. Поэтому я пытаюсь объяснить немного больше. Вводом является элемент управления XAML с привязкой данных. Теперь я хочу преобразовать это в простой XAML без привязки данных. Вывод может быть записан на диск и отображен любым приложением, которое понимает XAML, без привязки к чему-либо.
Таким образом, решение должно выглядеть примерно так:
FrameworkElementinput = (FrameworkElement)XamlReader.Read(inputFile);
input.DataContext = dataObject;
FrameworkElement output = ConvertToNative(input);
XamlWriter.Write(outputFile, output);
Я ищу реализацию 'ConvertToNative'
1 ответ
Если ты собираешься сделать это для UserControl
s, убедитесь, что сначала удалили атрибут x:Class, так как вы получите XamlParseException
иначе.
Вы можете загрузить файл Xaml с XamlReader.Load
и когда вы сохраните его с XamlWriter.Save
Привязки переводятся в их действительную стоимость. Кажется, есть некоторые проблемы с обновлением привязок, поэтому я решил эту проблему, подписавшись на событие Loaded и добавив его в контейнер в пользовательском интерфейсе, а в обработчике событий удалил if из контейнера и затем сохранил его. Это, вероятно, можно обойти лучше, хотя..
private void SomeMethod()
{
CreateXamlWithBindingValues("UserControl1.xaml", "UserControl1_Saved.xaml");
}
private void CreateXamlWithBindingValues(string sourcePath, string savePath)
{
StreamReader streamReader = new StreamReader(sourcePath);
StringReader stringReader = new StringReader(streamReader.ReadToEnd());
XmlReader xmlReader = XmlReader.Create(stringReader);
FrameworkElement loadedObject = (FrameworkElement)XamlReader.Load(xmlReader);
loadedObject.DataContext = UserControlViewModel;
RoutedEventHandler routedEventHandler = null;
routedEventHandler = new RoutedEventHandler(delegate
{
loadedObject.Loaded -= routedEventHandler;
grid1.Children.Remove(loadedObject);
string savedObject = XamlWriter.Save(loadedObject);
StreamWriter streamWriter = new StreamWriter(savePath);
streamWriter.Write(savedObject);
streamWriter.Close();
});
loadedObject.Loaded += routedEventHandler;
grid1.Children.Add(loadedObject);
}
Xaml перед сохранением
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock Text="{Binding Text}"/>
</Grid>
</UserControl>
Xaml после сохранения. Как видите, разрывов строк нет, но значение Text - это значение, полученное из привязки.
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><Grid><TextBlock Text="Actual Text Value" /></Grid></UserControl>
Xaml перед сохранением
<Grid Name="grid1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button Content="{Binding MyContent}"/>
</Grid>
Xaml после сохранения
<Grid Name="grid1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><Button>Actual Content</Button></Grid>