0

制作 UWP 应用。尝试从 Page1.xaml 导航到 Page2.xaml,将一些参数传递给 Page2.xaml,我收到以下错误:没有为此对象定义无参数构造函数。

Page1.xaml 有一个 for 循环,它添加按钮以导航到 Page2.xaml。Page2.xaml 内容是动态创建的,并且根据单击按钮的时间而具有不同的内容。

创建的按钮示例: App 1 App 2 Game 1 Game 2

当您单击每个按钮时,Page2.xaml 上会生成不同的内容。

在 for 循环中在 Page1.xaml 上添加按钮的代码是:

Button OpenAppButton = new Button();
OpenAppButton.Click += async delegate { Frame.Navigate(typeof(AppDisplay), AppDataTemp); };

AppDisplay 是 Page2.xaml。AppDataTemp 是传递给 Page2.xaml 的参数 [字符串]。

AppsDisplayStack.Children.Add(OpenAppButton);

该按钮被添加到名为 AppDisplayStack 的 StackPanel 中。

Page2.xaml 是以下代码:

    <Grid>
        <StackPanel>
            <ScrollViewer>
                <StackPanel x:Name="AppStack" VerticalAlignment="Top" HorizontalAlignment="Center">
                </StackPanel>
            </ScrollViewer>
        </StackPanel>
    </Grid>

Page2.xaml 中的所有其他内容都是动态创建的。

我有一种感觉,我没有正确传递参数。如果我尝试不使用参数,则会加载 Page2.xaml。有任何想法吗?提前感谢您的帮助。

编辑: 完整错误代码:{System.MissingMethodException:没有为此对象定义无参数构造函数。在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,Boolean publicOnly,Boolean wrapExceptions,Boolean& canBeCached,RuntimeMethodHandleInternal&ctor)在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean wrapExceptions,Boolean skipCheckThis,Boolean fillCache)在 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly , Boolean skipCheckThis, Boolean fillCache, Boolean wrapExceptions) at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions) at Microsoft.UI.Xaml.Markup.XamlReflectionType.ActivateInstance() at Windows.UI.Xaml.Controls.Frame .Navigate(类型 sourcePageType,对象参数)在 PermissionsAuditorViewer.AppsNGames.<>c__DisplayClass15_0。

不知道这是否有帮助。

UDPATE: 发现问题。我忘记了我将 Page2.xaml 的构造函数从“public AppDisplay()”更改为“public AppDisplay(string URLData)”。这导致了这个问题。谢谢你们的帮助。欣赏它。

4

1 回答 1

0

你能发布更多代码或解释更多吗?什么是 AppDataTemp 及其类型,您是在通过e.Parameter还是e.Parameter.YourModelsProperty 在通过的另一侧?如果您从一个页面拉到另一个页面并将其值绑定到该对象的另一个实例,则它需要在两个页面的代码隐藏中是相同的类型。

如果您的问题是No parameterless constructor defined for this object,那么看起来您没有正确定义框架,无论是第 1 页还是页面到(到或从),或者您需要声明一个相同类型的变量来绑定到您传递的任何数据导航。从您的解释看来,您需要声明模型或框架,并且需要类似

Frame rootFrame = this.Frame();

或者

YourModel VarName = new YourModel();在两个页面上或在两个页面上的页面YourModel Varname { get; set; }上创建一个对象并在导航功能中定义它VarName = e.Parameter;

或者如果你传入一个简单的 bool、string、int 等。

string VarName { get; set; }在两个页面上,您可以将其绑定到VarName = e.Parameter或者VarName = e.Parameter.YourModelStringProp

更新: 在您的情况下使用 e.Parameter 的示例是您的 OnNavigated 函数中的内容,例如:

YourModel VarName { get; set; }
string YourStr { get; set; }
protected override void OnNavigatedTo(NavigationEventArgs e){
    base.OnNavigatedTo(e);
    if (e.Parameter is string){  //common variable
        YourStr = e.Parameter;  //YourStr = e.Parameter.StrProp; //may need .ToString() for some
    }
    else //using a Model
    {
      YourModel = e.Parameter; // YourModel.YourProp = e.Parameter.YourProp;
    }
    //Use newly bound YourModel/YourStr here/elsewhere or call another function
    //function();
}

更新2: 您能否添加更多带有该错误的代码我相信它与您的导航和声明框架或声明您正在导航的页面有关,如果您发布一些代码,我可能会更容易看到. 我确定你真的很接近,但我相信你忘了声明你的框架,OpenAppButton.Click += async delegate { Frame.Navigate(typeof(AppDisplay), AppDataTemp); };我不确定你的布局是怎样的,但你应该能够从 App.xaml.cs 中提取你声明的框架,或者在每个页面上使用创建一个实例就像是

Frame rootFrame = Window.Current.Content as Frame;

然后将该行更改为

OpenAppButton.Click += async delegate { rootFrame.Navigate(typeof(AppDisplay), AppDataTemp); };

如果这无助于发布更多代码,我应该能够解决导致问题的原因。

于 2019-12-01T21:51:39.683 回答