我有在WPF编码的控制,可以有三个子元素之一 - 两个SimpleChildElements和一个ComplexChildElement,让我们说 - 并根据模型中的一些幕后的逻辑,让我做他们的显示器之间的互换.
<ItemsControl
ItemsSource="{Binding ChildPanels.Values}"
Name="ContentControl1"
>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}"
Visibility="{Binding Path=Active, Converter={StaticResource BooleanToVisibilityConverter}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
子元素是他们自己的ViewModel,我已经在上游声明了一些资源,因此有针对它们的DataTemplates.如果它有所帮助,我可以详细说明,但问题的关键因素是:
当我通过滚动在主控制元件和ComplexChildElement弹出的第一次,有一个短暂的,隐约可见闪烁,因为它得到的装饰 - 这是一堆的组合框饰的DevExpress.这种设置意味着有当我滚出一个记录与ComplexChildElement,然后再返回无闪烁,如果我开始与ComplexChildElement有主控显示,没有闪烁,当它再次弹出.
但主控制键到另一个数据源,我不能保证会出现在第一个记录,这是在一个更大的显示屏框架初始化加载ComplexChildElement我真的不想在此刻根左右.
那么我怎样才能保证在表单加载时会呈现ComplexChildElement,并可能在之后立即隐藏它?我已经尝试在这个后面的函数内部打开和关闭ChildPanels.Active:
<dxmvvm:Interaction.Triggers>
<dxmvvm:EventToCommand EventName="Loaded" Command="{Binding OnViewLoadedCommand}" />
</dxmvvm:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)
但这并没有让他们渲染.
顺便说一下这个功能:
foreach (var childModel in ChildPanels.Values)
{
childModel.Active = true;
RaisePropertyChanged(() => childModel.Active);
}
ChangeChildModel();
Run Code Online (Sandbox Code Playgroud)
最后一个函数调用是一个被调用的函数调用,用于在记录更改时更改子模型的可见性.如果我不进行最后一次调用,则所有子视图模型都会显示为可见.
为什么不从一开始就将Visibility设置为 false?这不会阻止您随后使用Active上的绑定。
绑定是可以的,但是因为 DataTemplate 使用它来修改 Visibility ,并且父控件使用它来了解是否应该呈现子控件。因此,根据PropertyChanged事件的订阅顺序,父控件可能会也可能不会将该控件视为可见。
顺便说一句,我想知道您的首要目标是否不是防止在多个控件上调用显示/隐藏时可能发生的闪烁。我不确定预渲染是否是正确的解决方案。
根据闪烁的根本原因,已经有几个修复方案:
归档时间: |
|
查看次数: |
766 次 |
最近记录: |