2011-03-24 65 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