Как отобразить элемент управления XAML с привязкой к данным в собственный чертеж XAML - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть элемент управления XAML с привязкой к данным, подобный этому:

<UserControl>
    <TextBlock Text="{Binding Text}" />
</UserControl>

и хотите, чтобы он отображался как «рисунок» следующим образом:

<UserControl>
    <TextBlock Text="Actual text value" />
</UserControl>

Кто-нибудь знает, как извлечь рисунок из произвольного элемента управления?

UPDATE: Этот вопрос не кажется ясным. Поэтому я пытаюсь объяснить немного больше. Вводом является элемент управления XAML с привязкой данных. Теперь я хочу преобразовать это в обычный XAML без привязки данных. Вывод может быть записан на диск и отображен любым приложением, которое понимает XAML, без привязки к чему-либо.

Таким образом, решение должно выглядеть примерно так:

FrameworkElementinput = (FrameworkElement)XamlReader.Read(inputFile);
input.DataContext = dataObject;
FrameworkElement output = ConvertToNative(input);
XamlWriter.Write(outputFile, output);

Я ищу реализацию 'ConvertToNative'

1 Ответ

2 голосов
/ 11 февраля 2011

Если вы собираетесь делать это в течение UserControl с, сначала удалите атрибут 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...