想想一个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()
但在第二场比赛中,它出现了失误。
"引用非共享成员需要对象引用。">
然后,回到Upload页面,我将变量和函数设置为"Shared"。但是,随之而来的是更多的问题。因为除非同时将局部变量设为"共享",否则无法编辑它们。因此,所有的变量和函数都需要"共享"。
几天来,我一直在寻找解决方案,但我无法摆脱它们。我应该使用什么方法?重定向回,还是打开一个新实例?
在旧类型的应用程序中,这非常容易。一切都是:
Form1.Crop_Bmp = Crop_Bmp
Me.Hide()
Form1.Crop()
它运行得很好。因为表单不是像WPF页面那样的实例。这就是我觉得WPF很奇怪的原因。
我找到了一种方法。当导航到裁剪页面时,我将上传页面作为参数发送到裁剪页面。
Dim CropPage As New Crop(Crop_Bmp, Crop_BmpSource, Me)
Me.NavigationService.Navigate(CropPage)
然后,在Crop:中
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()
这听起来像是Pages隐喻的一个糟糕用例。页面用于松散耦合的对等屏幕(例如,每个部门都有一个单独的页面),但您在紧密耦合的父子关系中使用它们。("裁剪"页面是"上传"页面的子页面)对于您正在做的事情,启动裁剪屏幕作为模式对话框可能更合适。
如果要将所有内容都保留在同一个窗口中,可以将两个函数都保留在相同的窗口中,并根据需要切换它们的可见性。