[英]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.