2011-03-24 67 views
0

(我正在尝试使用教程和文档来学习WPF,并尝试为我的后端完整应用程序开发用户界面,但我曾经说过,我听说有人说学习曲线非常陡峭,但有时我想知道无论我想要做什么实际上是WPF中很难做到的事情,或者如果它很简单,但我在错误地思考,或者如果它不是这样,它很简单,但我恰好不知道如何。)WPF中的灯箱样式弹出窗口 - 如何?

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

有点搜索引导我到WPF弹出窗口控件。我添加了它,放入了我的内容,将IsOpen属性设置为True,并 - presto!弹出窗口。然后我添加了一个不可见的Rectangle,它覆盖了我的整个窗口,并且当我想要打开弹出窗口时将其设置为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)如果那个孩子是一个画布,那也不算太坏。我可以检测到,并将其添加到画布。我必须找到一些方法来设置它的Left,Top等属性和Width和Height,因为这些似乎不是Rectangle控件的属性,而是由Canvas对象扩展 - 在XAML中它们被称为Cavnas.Top但当我尝试在代码中使用它时,Intellisense未显示它们。

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

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

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

在此先感谢您的帮助。

回答

4

1)我不能将它添加到WPF窗口,因为它已经有一个孩子。

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

下面是一个示例,您可以在Kaxaml中演示该示例。将Lightbox栅格的可见性设置为隐藏以访问隐藏的内容。

<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等于Attached Properties。附加属性在XAML中非常方便且易于使用,但是它们非常混乱,难以从代码中使用。隐藏邪恶的另一个原因。

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

我将您重定向回1. WPF中还有许多其他容器控件。你应该调查他们并观察他们如何控制布局。例如,我使用网格并不是要利用它的功能来阻挡用于控件的UI部分,而是因为它能够控制彼此的顶部并将它们展开到可用空间的最大可用大小(视图框只是放大控件而不是拉伸它们)。

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

窗口的根几乎总是一个容器控件。但是你可以控制它,所以如果你需要在运行时将控件添加到可视化树中,你可以很容易地确保窗口的子项是一个你可以处理的容器控件。

5)我认为我碰到更多的问题。但是让我们从这些开始。

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

+2

+1,尤其是最后一段。 OP的学习WPF的方法似乎是合理的 - 这与我自己的方法是一样的 - 但这是一个非常好的方式来花费几个令人沮丧的月份,在这期间你对WPF了解甚少。 – 2011-03-24 16:09:35

+0

谢谢大家! @ Will,re#1:我的问题的前提是,是否有可能在全球范围内重新使用任何窗口而不添加XAML或任何其他内容。这不是一个优点吗? 回复:MVVM和@Robert,谢谢你的提示。我同意并且我研究了MVVM,并且我非常喜欢它;我一定会继续走下去。虽然你会同意它不会解决这里发布的问题。 – Fred 2011-03-27 01:33:18

+0

@用户好,这表明你的覆盖被封装在用户控件中。创建一个通过代码与UI交互的实际控件,其指数级更复杂... – Will 2011-03-27 03:11:40