Как отобразить элемент управления 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>
Другие вопросы по тегам