簡體   English   中英

如何將數據綁定的XAML控件呈現到本機XAML繪圖

[英]How to render a databound XAML control to a native XAML drawing

我有一個數據綁定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'的實現

如果您要為UserControl執行此操作,請確保首先刪除x:Class屬性,否則您將獲得XamlParseException

您可以使用XamlReader.Load加載Xaml文件,當您使用XamlWriter.Save保存它時,綁定將轉換為它們的實際值。 將Bindings更新似乎有些麻煩,所以我通過訂閱Loaded事件並將其添加到UI中的容器,並在事件處理程序中從容器中刪除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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM