我有几个视图,我通过将可见性绑定到我的ViewModel中的布尔属性,在主窗口上显示为叠加层。
主窗口看起来像这样:
<Grid>
<vw:MainContentView/>
<!-- Overlays (normally invisible) -->
<vw:NotificationsView/>
</Grid>
'NotificationsView'的样式如下所示:
<Style x:Key="NotificationsView" TargetType="UserControl">
<!-- snipped -->
<Style.Triggers>
<DataTrigger Binding="{Binding IsNotificationsViewVisible}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsNotificationsViewVisible}" Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
我想知道在ViewModel中使用绑定到'IsNotificationViewVisible'属性的'IsOpen'属性的Popup是否更可取,而不是直接切换视图的可见性:
<Grid>
<vw:MainContentView />
<!-- Popups (normally invisible) -->
<Popup IsOpen="{Binding IsNotificationsViewVisible}">
<vw:NotificationItemsView/>
</Popup>
</Grid>
我是否有任何理由想要使用一种方法而不是另一种方法(内存使用或其他方式)?这两种方法似乎都运行得很好 - Popup附带了几个免费的动画,但看起来不一样。
答案 0 :(得分:1)
如果您在现有窗口上显示内容,则应该使用“可见性”方法。 Popup充当迷你窗口,可以根据主窗口中元素的位置初始定位自己。这意味着它可以超出主窗口的范围,并且在移动主窗口时不会移动。它也不会影响窗口中其他元素的布局。我想它也有一些与此相关的开销,但我没有运行任何确切的数字。
作为奖励,我会提出一个建议:你可以使用a converter to make Visibility binding easier。