WPF中的灯箱式弹出窗口 - 怎么样?

时间:2011-03-24 14:13:52

标签: wpf vb.net

(我正在尝试使用教程和文档来学习WPF,并尝试为我的后端完整应用程序开发用户界面,而我确实说过。我听说有人说学习曲线非常陡峭。但有时我我想知道我正在尝试做的事情实际上是在WPF中难以做到的事情,或者它是否很简单,但是我的思维方式错误,或者如果不是这样,那很简单,但我碰巧不知道怎么做。)

这是我目前的问题。我想点击点击我的用户界面的某些部分会弹出一个“弹出窗口”,用户可以在其中输入更多信息。我想要一个'灯箱式'弹出窗口,即弹出窗口是页面的模态,它会使页面的其余部分变暗以成为关注的中心,等等。这些常见于网站上。

一些搜索引导我进入WPF Popup控件。我添加了它,把我的内容放入,将IsOpen属性设置为True,然后 - presto!一个弹出窗口。然后我添加了一个覆盖整个窗口的不可见矩形,并在我希望弹出窗口打开时将其设置为Visible。太好了!

所以现在我想动态地执行此操作,因为有时我会加载一条记录,有时需要在弹出窗口中打开另一个控件(UserControl)来编辑其信息。所以我自己做了一个名为OpenPopup的方法。但我似乎无法找到使用WPF编写此方法的方法。在Windows窗体中,我写过:(我使用的是VB.NET)

Sub ShowPopup (form as Form, ctrl as Control)
    'Create 'rect' as new dark rectangle control
    'Z-order it to the top
    'form.Controls.Add 'rect'
    'form.Controls.Add ctrl
    'Z-order 'ctrl' to the top
    'Center 'ctrl'
    'Set focus to it
End Sub

但是对于WPF,我遇到了问题:

1)我无法将其添加到WPF窗口,因为它已经有了一个孩子。

2)如果那个孩子是画布,那也不算太糟糕。我可以检测到它,并将其添加到Canvas中。我必须找到一些方法来设置它的Left,Top等属性以及Width和Height,因为那些似乎不是Rectangle控件的属性,而是由Canvas对象扩展 - 在XAML中它们被称为Cavnas.Top但是当我尝试在代码中使用它时,Intellisense没有显示它们。

3)但是如果它是StackPanel?然后我的矩形将被堆叠在其他控件下方!而不是覆盖他们!有办法解决这个问题吗?

4)如果窗口只包含一个控件而根本没有容器控件?

5)我认为我遇到了更多问题。但让我们从这些开始。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

  

1)我无法将其添加到WPF窗口,因为它已经有了一个孩子。

啊,代码隐藏的弊端。解决方案不是将其添加到可视化树中,而是将其放置在可视树中,准备好并等待突袭,但是将其隐藏在用户的视图中。

这是一个可以放入Kaxaml的示例,它可以证明这一点。将灯箱网格的可见性设置为隐藏,以访问隐藏的内容。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Viewbox>
            <TextBox Text="SIMULATING CONTENT" />
        </Viewbox>
        <Grid x:Name="Lightbox" Visibility="Visible">
            <Rectangle Fill="Black" Opacity=".5"/>
            <Border
                Margin="100"
                Background="white"
                BorderBrush="CornflowerBlue"
                BorderThickness="4"
                CornerRadius="20">
                <Viewbox Margin="25">
                    <TextBox Text="SIMULATING LIGHTBOX"/>
                </Viewbox>
            </Border>
        </Grid>
    </Grid>
</Page>
  

2)(剪辑)当我尝试在代码中使用时,智能感知不显示它们。

Canvas.Top etal是Attached Properties。附加属性非常方便,易于在XAML中使用,但它们非常混乱,难以从代码中使用。代码隐藏是邪恶的另一个原因。

  

3)但是如果它是StackPanel?然后我的矩形将被堆叠在其他控件下方!而不是覆盖他们!有办法解决这个问题吗?

我将您重定向回1.在WPF中还有许多其他容器控件。您应该调查它们并观察它们如何控制布局。例如,我对网格的使用不是为了利用它阻止控件的UI部分的能力,而是因为它能够将控件叠加在彼此之上并将它们拉伸到可用空间的最大可用大小。 (视窗框只是用于缩放控件而不是拉伸它们。)

  

4)如果窗口只包含一个控件而根本没有容器控件?

窗口的根几乎总是一个容器控件。但是您可以控制它,因此如果您需要在运行时向可视树添加控件,您可以轻松确保窗口的子项是您可以处理的容器控件。

  

5)我认为我遇到了更多问题。但让我们从这些开始。

不开玩笑。对于你处境中的人,我的第一个建议是放弃你正在做的事情并了解MVVM。 Model-View-ViewModel是一种非常简单的WPF应用程序编码方式,它利用了WPF的许多功能 - 数据绑定,模板,命令等。它允许您编写逻辑而不是代码隐藏( RETCH) )但易于创建和测试类。