首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataTemplate只显示最后一条记录的画布

问DataTemplate只显示最后一条记录的画布
EN

Stack Overflow用户
提问于 2015-09-01 04:36:59
回答 2查看 117关注 0票数 2

我正在使用以下DataTemplate

代码语言:javascript
复制
<DataTemplate x:Key="platform_resources">
   <StackPanel Orientation="Horizontal">
      <Viewbox Width="30" Height="30" ToolTip="Network Domain Count" Stretch="Uniform">
           <ContentControl  DataContext="{Binding}" Focusable="False" Content="{DynamicResource appbar_server}" />
                </Viewbox>
                <TextBlock Margin="0,7,0,0" Text="{Binding Path=workload_count}"/>
                <Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
                <Viewbox Width="30" Height="30" ToolTip="Logical Network Count" Stretch="Uniform">
                    <ContentControl Focusable="False" Content="{DynamicResource appbar_network_server_connecting}" />
                </Viewbox>
                <TextBlock Margin="0,7,0,0" Text="{Binding Path=vlan_count}"/>
                <Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
                <Viewbox Width="30" Height="30" ToolTip="Network Domain Count" Stretch="Uniform">
           <ContentControl Focusable="False" Content="{DynamicResource appbar_network}" />
      </Viewbox>

     <TextBlock Margin="0,7,0,0" Text="{Binding Path=networkdomain_count}"/>

   </StackPanel>
</DataTemplate>

模板用分隔符显示所有相关数据,但只显示在最后一个记录上的图像。它留下了图像应该存在的空间,但没有图像。

​

​

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-01 04:57:33

确保将x:Shared="False"属性添加到资源中。

示例:

代码语言:javascript
复制
<Canvas x:Key="appbar_server" x:Shared="False">
   <!-- ... -->
</Canvas>
票数 3
EN

Stack Overflow用户

发布于 2015-09-01 12:48:27

这是因为您可能在资源中定义了一些Images (例如appbar_server),并试图在多个项中显示它们。但是Image是一个Visual,在WPF中,每个Visual只能有一个父级。因此,当生成项时,每个项都会从上一项中窃取Image,直到最后一项最终得到为止。

解决方案:

与Image不同,BitmapImage不是Visual,因此可以多次将其设置为不同项的源。因此,与其在Resources中定义BitmapImages,不如定义BitmapImages:

代码语言:javascript
复制
<Window.Resources>
    <BitmapImage x:Key="appbar_server" UriSource="C:\...\appbar_server.png"/>
    ....

然后,用ContentControl在DataTemplate中创建Image实例来表示它们,而不是DataTemplate:

代码语言:javascript
复制
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Viewbox Width="30" Height="30" ToolTip="Network Domain Count" Stretch="Uniform">
                        <Image  Focusable="False" Source="{DynamicResource appbar_server}" />
                    </Viewbox>
                    <TextBlock Margin="0,7,0,0" Text="{Binding Path=workload_count}"/>
                    ...

*更新:

图像是在画布中捕获的,而画布似乎需要一些特殊的包装才能完成这项工作。

在这种情况下,您应该为每个DataTemplate定义一个Canvas,如下所示:

代码语言:javascript
复制
<Window.Resources>
    <DataTemplate x:Key="appbar_3d_3ds">
        <Canvas  Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
            <Path Width="32" Height="40" Canvas.Left="23" Canvas.Top="18" Stretch="Fill" Fill="Black" Data="F1 M 27,18L 23,26L 33,30L 24,38L 33,46L 23,50L 27,58L 45,58L 55,38L 45,18L 27,18 Z "/>
        </Canvas>
    </DataTemplate>
    ....

然后在您的ContentPresenter中创建ItemTemplate实例,并将其ContentTemplate设置为预定义的数据模板(例如appbar_3d_3ds)。

代码语言:javascript
复制
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Viewbox Width="30" Height="30" ToolTip="Network Domain Count" Stretch="Uniform">
                        <ContentPresenter ContentTemplate="{DynamicResource appbar_3d_3ds}"/>
                    </Viewbox>
                    <TextBlock Margin="0,7,0,0" Text="{Binding Path=workload_count}"/>
                    ....
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32323627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档