我有一个自定义的InlineImage 类,会利用设置的base64字符串在界面上显示一个Image,类似这样:FlowDocument doc = new FlowDocument();
InlineImage img = new InlineImage();
img.Width = 20;
img.Height = 20;
img.Base64Source = base64String;
doc.Blocks.Add(img); 显示没有问题,但我还想将其做为xaml保存起来,使用以下代码string xaml = XamlWriter.Save(doc);得到的xaml是这样的,
<!--省略部分头部内容-->
<rttac:InlineImage Width="20" Height="20">
<rttac:InlineImage.Child>
<Image Stretch="Uniform" StretchDirection="Both" Width="20" Height="20">
<Image.Source><BitmapImage BaseUri="{x:Null}" /></Image.Source>
</Image>
</rttac:InlineImage.Child>
iVBORw0KGg....3a8EQn3QQbWI19U6FxOyJ39qGQL5gZKkYSJBgCCwHM++f/SXAxaJ43MKIgotUYkaeixRiBF9BaAn4Carbq4WinWykAAAAASUVORK5CYII=
</rttac:InlineImage>
</FlowDocument>主要是动态创建的Image也包含在了xaml里,我想有没有办法去掉 <rttac:InlineImage.Child>节点。先谢谢了。看了一个下午的MSDN,只找到这个
https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/element-tree-and-serialization
但似乎没有我想要的内容,我希望InlineImage 能控制自己xaml的过程自定义类的主要代码如下[ContentProperty("Base64Source")]
public class InlineImage : BlockUIContainer, INameScope
{ //....
public string Base64Source
{
get { return (string)GetValue(Base64SourceProperty); }
set { SetValue(Base64SourceProperty, value); }
}
//...
private static void OnBase64SourceChanged(DependencyObject sender,
DependencyPropertyChangedEventArgs e)
{
var inlineImage = (InlineImage)sender;
var stream = new MemoryStream(Convert.FromBase64String(inlineImage.Base64Source)); var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = stream;
bitmapImage.EndInit(); var image = new Image
{
Source = bitmapImage,
Stretch = inlineImage.Stretch,
StretchDirection = inlineImage.StretchDirection,
}; if (!double.IsNaN(inlineImage.Width))
{
image.Width = inlineImage.Width;
} if (!double.IsNaN(inlineImage.Height))
{
image.Height = inlineImage.Height;
} inlineImage.Child = image;
}
}
InlineImage img = new InlineImage();
img.Width = 20;
img.Height = 20;
img.Base64Source = base64String;
doc.Blocks.Add(img); 显示没有问题,但我还想将其做为xaml保存起来,使用以下代码string xaml = XamlWriter.Save(doc);得到的xaml是这样的,
<!--省略部分头部内容-->
<rttac:InlineImage Width="20" Height="20">
<rttac:InlineImage.Child>
<Image Stretch="Uniform" StretchDirection="Both" Width="20" Height="20">
<Image.Source><BitmapImage BaseUri="{x:Null}" /></Image.Source>
</Image>
</rttac:InlineImage.Child>
iVBORw0KGg....3a8EQn3QQbWI19U6FxOyJ39qGQL5gZKkYSJBgCCwHM++f/SXAxaJ43MKIgotUYkaeixRiBF9BaAn4Carbq4WinWykAAAAASUVORK5CYII=
</rttac:InlineImage>
</FlowDocument>主要是动态创建的Image也包含在了xaml里,我想有没有办法去掉 <rttac:InlineImage.Child>节点。先谢谢了。看了一个下午的MSDN,只找到这个
https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/element-tree-and-serialization
但似乎没有我想要的内容,我希望InlineImage 能控制自己xaml的过程自定义类的主要代码如下[ContentProperty("Base64Source")]
public class InlineImage : BlockUIContainer, INameScope
{ //....
public string Base64Source
{
get { return (string)GetValue(Base64SourceProperty); }
set { SetValue(Base64SourceProperty, value); }
}
//...
private static void OnBase64SourceChanged(DependencyObject sender,
DependencyPropertyChangedEventArgs e)
{
var inlineImage = (InlineImage)sender;
var stream = new MemoryStream(Convert.FromBase64String(inlineImage.Base64Source)); var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = stream;
bitmapImage.EndInit(); var image = new Image
{
Source = bitmapImage,
Stretch = inlineImage.Stretch,
StretchDirection = inlineImage.StretchDirection,
}; if (!double.IsNaN(inlineImage.Width))
{
image.Width = inlineImage.Width;
} if (!double.IsNaN(inlineImage.Height))
{
image.Height = inlineImage.Height;
} inlineImage.Child = image;
}
}
这段不显示么?试试 InlineImage 直接从ContentControl 派生,Child 不要,用Content属性取代
也可以试试用下面的特性修饰下你的Child属性。 [ContentProperty("Content")]
public class ContentControl : Control, IAddChild
.Net 现在开源了,不明白就看看源码