2012-12-02 51 views
0

想想一個WPF程序,它有2個頁面,您可以在它們之間導航。 (上傳和裁剪)WPF失敗。使用WPF頁面作爲實例

在第一頁中,您使用按鈕加載圖像,選擇圖像,並且圖像出現在WPF圖像控件中。然後,按下「裁剪」按鈕。這將導航發送到第二頁,您可以裁剪圖像。

然後,在第二頁中裁剪圖像。然後你按下「下一個」。下一步按鈕必須將您重定向到第一頁,但稍等片刻,您加載的圖像不再存在於頁面中。因爲這是一個新的頁面。

Dim CropPage As New Crop(Crop_Bmp, Crop_BmpSource) 
    Me.NavigationService.Navigate(CropPage) 

您可能認爲沒關係。因爲我們傳遞了參數,我們可以使用該參數來填充WPF圖像控件。但是,頁面1實際上有8個上傳面板。所以,其他的很重要。

或想想我發現的另一種方法。不要使用新的頁面實例,請返回您使用的頁面。

Upload.Crop_Bmp = Crop_Bmp 
    Upload.Crop_BmpSource = Crop_BmpSource 
    Me.NavigationService.GoBack() 
    Upload.Crop() 

但在第二個,它會引發錯誤。

「對非共享成員的引用需要對象引用。」

然後回到上傳頁面,我做了變量和函數「共享」。但是,隨後出現更多問題。因爲你不能編輯局部變量,除非你讓它們共享。所以,所有的變量和函數都需要「共享」。

我正在尋找解決方案几天,我無法擺脫它們。我應該使用什麼方法?重新導向,或打開新的實例?

在舊式應用中,這非常簡單。全部是:

Form1.Crop_Bmp = Crop_Bmp 
    Me.Hide() 
    Form1.Crop() 

它的工作完美。因爲表單不是WPF頁面的實例。這就是我發現WPF很奇怪的原因。

+0

「你發現WPF很怪異」,因爲你使用的是winforms思維模式。忘記你在winforms中學到的所有東西,並開始學習MVVM模式。否則,你將在WPF中失敗。並不要責怪WPF。 –

+0

哦,並開始在C#中編碼。 VB.Net是一種玩具語言。 –

回答

0

我發現它是一種方法來做到這一點。當瀏覽到裁剪頁面時,我將上傳頁面作爲參數發送到裁剪頁面。

Dim CropPage As New Crop(Crop_Bmp, Crop_BmpSource, Me) 
    Me.NavigationService.Navigate(CropPage) 

然後,在作物:

Public Sub New(ByVal Crop_Bitmap_ As Bitmap, ByVal Crop_BitmapSource_ As BitmapSource, ByVal pg As Upload) 

    ' This call is required by the designer. 
    InitializeComponent() 

    UploadPage = pg 

然後,在裁剪頁面,我訪問的參數修改其內容。例如:

Me.NavigationService.Navigate(UploadPage) 
    UploadPage.Crop() 
0

這聽起來像是一個糟糕的頁面隱喻用例。頁面是鬆散耦合的對等屏幕(E.G.每個部門都有一個單獨的頁面),但是您正在以緊密結合的父子關係使用它們。 (「裁剪」頁面是「上傳」頁面的子頁面)對於您正在做的操作,將裁剪屏幕作爲模式對話框啓動可能更合適。

如果您希望將所有內容都保存在同一個窗口中,則可以將這兩個函數保留在同一個窗口中,並根據需要切換其可見性。