UWP技术咨询:能否在ResourceDictionary中存放Image并在DataTemplate中引用?
你的思路方向对,但做法错了——别把Image控件实例放进ResourceDictionary!
兄弟,你想通过复用资源减少内存占用的思路完全没问题,但你选错了要复用的对象:你不能把Image这种UI控件实例放到ResourceDictionary里共享!
为啥会崩溃?因为WPF/UWP里的UI元素(比如Image)有个硬性规则:一个UI元素只能属于一个可视化树,也就是只能有一个父容器。当你的DataTemplate为每个列表项生成内容时,都会尝试把同一个Image实例塞到不同的项容器里——这就相当于让同一个控件同时待在两个地方,WPF直接就会抛出异常,导致应用崩溃。
正确的做法:复用ImageSource,而不是Image控件
要实现资源复用、减少内存占用,你应该把**图像的数据源(ImageSource)**放到ResourceDictionary里,而不是Image控件本身。ImageSource是纯数据对象,不属于可视化树,完全可以被多个Image控件共享,图像数据只会被加载一次。
针对你的SVG图片,这里给你两种常见场景的实现方式:
1. 如果你用的是SharpVectors这类SVG处理库(WPF/UWP通用方案)
先把SvgImageSource定义到ResourceDictionary中:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"> <!-- 定义可共享的SVG数据源 --> <svgc:SvgImageSource x:Key="Archive_Rudiment_Source" UriSource="..\Assets\your-archive-icon.svg"/> </ResourceDictionary>
然后在DataTemplate里使用独立的Image控件,引用这个共享的Source:
<DataTemplate> <Image Source="{StaticResource Archive_Rudiment_Source}" Width="24" Height="24"/> </DataTemplate>
2. 如果是WPF原生支持的SVG(通过DrawingImage)
如果你的SVG已经被转换为Drawing资源,也可以这样定义:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <DrawingImage x:Key="Archive_Rudiment_Source"> <DrawingImage.Drawing> <!-- 这里放SVG转换后的Drawing内容 --> </DrawingImage.Drawing> </DrawingImage> </ResourceDictionary>
这样每个列表项里的Image都是独立的UI实例,但它们共享同一个ImageSource,既保证了UI的正常渲染,又实现了资源复用,完全符合你的初衷。
内容的提问来源于stack exchange,提问作者LeBrown Jones
相关产品推荐
相关产品推荐

