我们有一个Infragistics XamDatagrid,其中包含一个包含图像的列。
此图像可见或不可见,具体取决于ViewModel属性。当它可见时,如果将鼠标悬停在上方,则会显示一个弹出窗口。请参阅下面的XAML以获取此专栏。
<Setter Property="IsEnabled" Value="true" />
<Setter Property="Focusable" Value="false" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataPresenter:CellValuePresenter}">
<Border Background="{StaticResource FrozenColumnBrush}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Image x:Name="BarrierImage"
Grid.Row="0"
Height="16" Width="16"
HorizontalAlignment="Center" VerticalAlignment="Center"
Source="../Images/lock_16.ico"
Visibility="{Binding DataItem.IsBarrierEvent, Converter={StaticResource BooleanToVisibilityConverter}}" >
</Image>
<Grid Grid.Row="1" Visibility="{Binding DataItem.IsBarrierEvent, Converter={StaticResource BooleanToVisibilityConverter}}" >
<Popup
Name="BarrierPopup"
AllowsTransparency="True"
PopupAnimation="Fade"
HorizontalOffset="-35"
VerticalOffset="0"
Behaviors:OpenPopupWhenTooltipOpening.Control="{Binding ElementName=BarrierImage}"
>
<Views:BarrierView DataContext="{Binding DataItem.Barriers}"/>
</Popup>
</Grid>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
问题是我们得到200行,但只有一行有IsBarrierEvent = true,因此只有一个图像,并且在悬停时只会显示一个弹出窗口。但事实证明,WPF为每一行创建了一个BarrierView控件。我们注意到使用dotTrace来调查性能问题时。
有没有办法阻止创建这种不可见的控件?我们还尝试将viewmodel属性绑定到主边框可见性,但它们仍在创建中。
感谢。
P.S - 我试图粘贴样式的XAML标签,但没有正确显示
答案 0 :(得分:1)
我建议您创建自己的自定义控件并将图像,弹出窗口等移动到该控件的模板中。当您在模板中定义了元素并且应用了该模板时,将创建该模板中的所有元素,因此在应用CVP模板时,这意味着将创建Image,Popup,BarrierView等。如果模板中的祖先元素已折叠。但是,如果模板的可见性已折叠,则该控件的模板在首次测量之前不会应用,直到可见性被隐藏或可见时才会应用。