弹出窗口与可见性切换

时间:2009-12-16 16:33:43

标签: wpf xaml mvvm

我有几个视图,我通过将可见性绑定到我的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附带了几个免费的动画,但看起来不一样。

1 个答案:

答案 0 :(得分:1)

如果您在现有窗口上显示内容,则应该使用“可见性”方法。 Popup充当迷你窗口,可以根据主窗口中元素的位置初始定位自己。这意味着它可以超出主窗口的范围,并且在移动主窗口时不会移动。它也不会影响窗口中其他元素的布局。我想它也有一些与此相关的开销,但我没有运行任何确切的数字。

作为奖励,我会提出一个建议:你可以使用a converter to make Visibility binding easier