奇怪的 NullReferenceException 和无用的调用堆栈
Strange NullReferenceException and useless Call Stack
我决定将我的 xaml 页面中的布局从 absolut 更改为 stacklayout,之后我的应用程序启动时出现 nullre.. 异常 运行。我从一个到另一个评论了页面中的所有元素,甚至是堆栈布局,但我仍然有错误。我第一次尝试使用 Call Stack,但我看不出我能用它做什么。
在我开始更改我的页面之前,一切都运行良好。
此外,它是 MasterDetailPage 的母版页。
Xaml.cs 文件为空。
现在是xaml:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
xmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="GitRemote.Views.MasterPage"
Title="Necessary">
<!--<StackLayout x:Name="MasterMenu"
HorizontalOptions="StartAndExpand"
VerticalOptions="StartAndExpand">
--><!--<BoxView x:Name="GrayHeader"
Color="#CACED2"
HorizontalOptions="StartAndExpand"
VerticalOptions="Start"
HeightRequest="100"/>--><!--
--><!--<Image x:Name="MasterProfileImage"
WidthRequest="50"
HeightRequest="50"
Source="ic_account_circle_white_24dp.png"
HorizontalOptions="Start"
VerticalOptions="Start"
Margin="15, 15, 0, 0"/>--><!--
--><!--<Image x:Name="LogOutImage"
WidthRequest="45"
HeightRequest="45"
Source="ic_menu_logout.png"
HorizontalOptions="End"
VerticalOptions="Start"
Margin="0, 15, 15, 0"/>--><!--
--><!--<Label x:Name="MasterProfileName"
Text="GitRemote"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Start"
VerticalOptions="Start"
TextColor="Black"
Margin="15, 80, 0, 0"/>--><!--
--><!--<ListView x:Name="MasterPageMenu"
SeparatorColor="Transparent"
HorizontalOptions="Start"
VerticalOptions="Start"
Margin="15, 120, 0, 0"
ItemsSource="{Binding MenuItems}"
SelectedItem="{Binding MenuItemSelectedProperty, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal"
Spacing="15"
Padding="10" >
<Label Text="{Binding Name}"
FontSize="16"
VerticalOptions="Center"
FontAttributes="Bold"/>
<Image Source="{Binding ImageSource}"
WidthRequest="25"
HeightRequest="25" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<b:Interaction.Behaviors>
<b:BehaviorCollection>
<b:EventToCommand EventName="ItemSelected"
Command="{Binding MenuItemSelected}"></b:EventToCommand>
</b:BehaviorCollection>
</b:Interaction.Behaviors>
</ListView>--><!--
</StackLayout>-->
</ContentPage>`
**这是之前的样子:
**
`
<!--Header-->
<BoxView x:Name="GrayHeader"
Style="{StaticResource GrayBoxView}"
AbsoluteLayout.LayoutBounds="{Binding MasterProfileGrayHeaderBounds}"
AbsoluteLayout.LayoutFlags="All">
</BoxView>
<Image x:Name="MasterProfileImage"
WidthRequest="50"
HeightRequest="50"
Source="ic_account_circle_white_24dp.png"
AbsoluteLayout.LayoutBounds="{Binding MasterProfileImageBounds}"
AbsoluteLayout.LayoutFlags="None">
</Image>
<Label x:Name="MasterProfileName"
Text="GitRemote"
FontAttributes="Bold"
FontSize="18"
AbsoluteLayout.LayoutBounds="{Binding MasterProfileNameBounds}"
AbsoluteLayout.LayoutFlags="None">
</Label>
<!--Body-->
<ListView x:Name="MasterPageMenu"
SeparatorColor="Transparent"
AbsoluteLayout.LayoutBounds="{Binding MasterMenuBounds}"
AbsoluteLayout.LayoutFlags="None"
ItemsSource="{Binding MenuItems}"
SelectedItem="{Binding MenuItemSelectedProperty, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" Spacing="15" Padding="10" >
<Label Text="{Binding Name}" FontSize="16" VerticalOptions="Center" FontAttributes="Bold"/>
<Image Source="{Binding ImageSource}" WidthRequest="25" HeightRequest="25" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<b:Interaction.Behaviors>
<b:BehaviorCollection>
<b:EventToCommand EventName="ItemSelected" Command="{Binding MenuItemSelected}"></b:EventToCommand>
</b:BehaviorCollection>
</b:Interaction.Behaviors>
</ListView>
现在这是我的 ViewModel:
using GitRemote.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System.Collections.ObjectModel;
namespace GitRemote.ViewModels
{
public class MasterPageViewModel : BindableBase
{
#region Constants
private const string GistsPageImagePath = "ic_code_black_24dp.png";
private const string IssueDashboardPageImagePath = "ic_slow_motion_video_black_24dp.png";
private const string BookmarksPageImagePath = "ic_bookmark_black_24dp.png";
private const string ReportAnIssuePageImagePath = "ic_error_outline_black_24dp.png";
#endregion
//#region Bindable properties
//private Rectangle _masterProfileGrayHeaderBounds;
//public Rectangle MasterProfileGrayHeaderBounds
//{
// get { return _masterProfileGrayHeaderBounds; }
// set { SetProperty(ref _masterProfileGrayHeaderBounds, value); }
//}
//private Rectangle _masterProfileImageBounds;
//public Rectangle MasterProfileImageBounds
//{
// get { return _masterProfileImageBounds; }
// set { SetProperty(ref _masterProfileImageBounds, value); }
//}
//private Rectangle _masterProfileNameBounds;
//public Rectangle MasterProfileNameBounds
//{
// get { return _masterProfileNameBounds; }
// set { SetProperty(ref _masterProfileNameBounds, value); }
//}
//private Rectangle _masterMenuBounds;
//public Rectangle MasterMenuBounds
//{
// get { return _masterMenuBounds; }
// set { SetProperty(ref _masterMenuBounds, value); }
//}
//private MasterPageMenuItemModel _menuItemSelectedProperty;
//public MasterPageMenuItemModel MenuItemSelectedProperty
//{
// get { return _menuItemSelectedProperty; }
// set { SetProperty(ref _menuItemSelectedProperty, value); }
//}
////#endregion
//private readonly INavigationService _navigationService;
//public ObservableCollection<MasterPageMenuItemModel> MenuItems;
//public DelegateCommand MenuItemSelected;
public MasterPageViewModel()
{
//_navigationService = navigationService;
//MenuItemSelected = new DelegateCommand(OnMenuItemSelected);
//MasterProfileGrayHeaderBounds = new Rectangle(0, 0, 1, 0.175);
//MasterProfileImageBounds = new Rectangle(16, 16, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
//MasterProfileNameBounds = new Rectangle(16, 70, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
//MasterMenuBounds = new Rectangle(16, 100 + 10, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
//MenuItems = new ObservableCollection<MasterPageMenuItemModel>
//{
// new MasterPageMenuItemModel {Name = "GistsPage", ImageSource = GistsPageImagePath},
// new MasterPageMenuItemModel {Name = "IssueDashboardPage", ImageSource = IssueDashboardPageImagePath},
// new MasterPageMenuItemModel {Name = "BookmarksPage", ImageSource = BookmarksPageImagePath},
// new MasterPageMenuItemModel {Name = "ReportAnIssuePage", ImageSource = ReportAnIssuePageImagePath}
//};
}
//private void OnMenuItemSelected()
//{
// if ( MenuItemSelectedProperty == null ) return;
// _navigationService.NavigateAsync(MenuItemSelectedProperty.Name, animated: false);
// MenuItemSelectedProperty = null;
//}
}
}
之前:
using GitRemote.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace GitRemote.ViewModels
{
public class MasterPageViewModel : BindableBase
{
#region Constants
private const string GistsPageImagePath = "ic_code_black_24dp.png";
private const string IssueDashboardPageImagePath = "ic_slow_motion_video_black_24dp.png";
private const string BookmarksPageImagePath = "ic_bookmark_black_24dp.png";
private const string ReportAnIssuePageImagePath = "ic_error_outline_black_24dp.png";
#endregion
#region Bindable properties
private Rectangle _masterProfileGrayHeaderBounds;
public Rectangle MasterProfileGrayHeaderBounds
{
get { return _masterProfileGrayHeaderBounds; }
set { SetProperty(ref _masterProfileGrayHeaderBounds, value); }
}
private Rectangle _masterProfileImageBounds;
public Rectangle MasterProfileImageBounds
{
get { return _masterProfileImageBounds; }
set { SetProperty(ref _masterProfileImageBounds, value); }
}
private Rectangle _masterProfileNameBounds;
public Rectangle MasterProfileNameBounds
{
get { return _masterProfileNameBounds; }
set { SetProperty(ref _masterProfileNameBounds, value); }
}
private Rectangle _masterMenuBounds;
public Rectangle MasterMenuBounds
{
get { return _masterMenuBounds; }
set { SetProperty(ref _masterMenuBounds, value); }
}
private MasterPageMenuItemModel _menuItemSelectedProperty;
public MasterPageMenuItemModel MenuItemSelectedProperty
{
get { return _menuItemSelectedProperty; }
set { SetProperty(ref _menuItemSelectedProperty, value); }
}
#endregion
private readonly INavigationService _navigationService;
public ObservableCollection<MasterPageMenuItemModel> MenuItems;
public DelegateCommand MenuItemSelected;
public MasterPageViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
MenuItemSelected = new DelegateCommand(OnMenuItemSelected);
MasterProfileGrayHeaderBounds = new Rectangle(0, 0, 1, 0.175);
MasterProfileImageBounds = new Rectangle(16, 16, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
MasterProfileNameBounds = new Rectangle(16, 70, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
MasterMenuBounds = new Rectangle(16, 100 + 10, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
MenuItems = new ObservableCollection<MasterPageMenuItemModel>
{
new MasterPageMenuItemModel {Name = "GistsPage", ImageSource = GistsPageImagePath},
new MasterPageMenuItemModel {Name = "IssueDashboardPage", ImageSource = IssueDashboardPageImagePath},
new MasterPageMenuItemModel {Name = "BookmarksPage", ImageSource = BookmarksPageImagePath},
new MasterPageMenuItemModel {Name = "ReportAnIssuePage", ImageSource = ReportAnIssuePageImagePath}
};
}
private void OnMenuItemSelected()
{
if ( MenuItemSelectedProperty == null ) return;
_navigationService.NavigateAsync(MenuItemSelectedProperty.Name, animated: false);
MenuItemSelectedProperty = null;
}
}
}
我评论了所有的东西,但我不知道它发生在哪里以及为什么发生。
图片上是我的调用堆栈。但我不知道它是什么意思,我也无能为力。
在 Prism 中,您可以将参数从当前视图模型发送到您导航的页面视图模型。所以我在发送参数,另一方面我在接收它们。但是,在我打电话给他们之前,我并没有检查他们是否存在。于是就有了 NullReferenceException。
我决定将我的 xaml 页面中的布局从 absolut 更改为 stacklayout,之后我的应用程序启动时出现 nullre.. 异常 运行。我从一个到另一个评论了页面中的所有元素,甚至是堆栈布局,但我仍然有错误。我第一次尝试使用 Call Stack,但我看不出我能用它做什么。 在我开始更改我的页面之前,一切都运行良好。 此外,它是 MasterDetailPage 的母版页。 Xaml.cs 文件为空。 现在是xaml:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
xmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="GitRemote.Views.MasterPage"
Title="Necessary">
<!--<StackLayout x:Name="MasterMenu"
HorizontalOptions="StartAndExpand"
VerticalOptions="StartAndExpand">
--><!--<BoxView x:Name="GrayHeader"
Color="#CACED2"
HorizontalOptions="StartAndExpand"
VerticalOptions="Start"
HeightRequest="100"/>--><!--
--><!--<Image x:Name="MasterProfileImage"
WidthRequest="50"
HeightRequest="50"
Source="ic_account_circle_white_24dp.png"
HorizontalOptions="Start"
VerticalOptions="Start"
Margin="15, 15, 0, 0"/>--><!--
--><!--<Image x:Name="LogOutImage"
WidthRequest="45"
HeightRequest="45"
Source="ic_menu_logout.png"
HorizontalOptions="End"
VerticalOptions="Start"
Margin="0, 15, 15, 0"/>--><!--
--><!--<Label x:Name="MasterProfileName"
Text="GitRemote"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Start"
VerticalOptions="Start"
TextColor="Black"
Margin="15, 80, 0, 0"/>--><!--
--><!--<ListView x:Name="MasterPageMenu"
SeparatorColor="Transparent"
HorizontalOptions="Start"
VerticalOptions="Start"
Margin="15, 120, 0, 0"
ItemsSource="{Binding MenuItems}"
SelectedItem="{Binding MenuItemSelectedProperty, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal"
Spacing="15"
Padding="10" >
<Label Text="{Binding Name}"
FontSize="16"
VerticalOptions="Center"
FontAttributes="Bold"/>
<Image Source="{Binding ImageSource}"
WidthRequest="25"
HeightRequest="25" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<b:Interaction.Behaviors>
<b:BehaviorCollection>
<b:EventToCommand EventName="ItemSelected"
Command="{Binding MenuItemSelected}"></b:EventToCommand>
</b:BehaviorCollection>
</b:Interaction.Behaviors>
</ListView>--><!--
</StackLayout>-->
</ContentPage>`
**这是之前的样子: ** `
<!--Header-->
<BoxView x:Name="GrayHeader"
Style="{StaticResource GrayBoxView}"
AbsoluteLayout.LayoutBounds="{Binding MasterProfileGrayHeaderBounds}"
AbsoluteLayout.LayoutFlags="All">
</BoxView>
<Image x:Name="MasterProfileImage"
WidthRequest="50"
HeightRequest="50"
Source="ic_account_circle_white_24dp.png"
AbsoluteLayout.LayoutBounds="{Binding MasterProfileImageBounds}"
AbsoluteLayout.LayoutFlags="None">
</Image>
<Label x:Name="MasterProfileName"
Text="GitRemote"
FontAttributes="Bold"
FontSize="18"
AbsoluteLayout.LayoutBounds="{Binding MasterProfileNameBounds}"
AbsoluteLayout.LayoutFlags="None">
</Label>
<!--Body-->
<ListView x:Name="MasterPageMenu"
SeparatorColor="Transparent"
AbsoluteLayout.LayoutBounds="{Binding MasterMenuBounds}"
AbsoluteLayout.LayoutFlags="None"
ItemsSource="{Binding MenuItems}"
SelectedItem="{Binding MenuItemSelectedProperty, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" Spacing="15" Padding="10" >
<Label Text="{Binding Name}" FontSize="16" VerticalOptions="Center" FontAttributes="Bold"/>
<Image Source="{Binding ImageSource}" WidthRequest="25" HeightRequest="25" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<b:Interaction.Behaviors>
<b:BehaviorCollection>
<b:EventToCommand EventName="ItemSelected" Command="{Binding MenuItemSelected}"></b:EventToCommand>
</b:BehaviorCollection>
</b:Interaction.Behaviors>
</ListView>
现在这是我的 ViewModel:
using GitRemote.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System.Collections.ObjectModel;
namespace GitRemote.ViewModels
{
public class MasterPageViewModel : BindableBase
{
#region Constants
private const string GistsPageImagePath = "ic_code_black_24dp.png";
private const string IssueDashboardPageImagePath = "ic_slow_motion_video_black_24dp.png";
private const string BookmarksPageImagePath = "ic_bookmark_black_24dp.png";
private const string ReportAnIssuePageImagePath = "ic_error_outline_black_24dp.png";
#endregion
//#region Bindable properties
//private Rectangle _masterProfileGrayHeaderBounds;
//public Rectangle MasterProfileGrayHeaderBounds
//{
// get { return _masterProfileGrayHeaderBounds; }
// set { SetProperty(ref _masterProfileGrayHeaderBounds, value); }
//}
//private Rectangle _masterProfileImageBounds;
//public Rectangle MasterProfileImageBounds
//{
// get { return _masterProfileImageBounds; }
// set { SetProperty(ref _masterProfileImageBounds, value); }
//}
//private Rectangle _masterProfileNameBounds;
//public Rectangle MasterProfileNameBounds
//{
// get { return _masterProfileNameBounds; }
// set { SetProperty(ref _masterProfileNameBounds, value); }
//}
//private Rectangle _masterMenuBounds;
//public Rectangle MasterMenuBounds
//{
// get { return _masterMenuBounds; }
// set { SetProperty(ref _masterMenuBounds, value); }
//}
//private MasterPageMenuItemModel _menuItemSelectedProperty;
//public MasterPageMenuItemModel MenuItemSelectedProperty
//{
// get { return _menuItemSelectedProperty; }
// set { SetProperty(ref _menuItemSelectedProperty, value); }
//}
////#endregion
//private readonly INavigationService _navigationService;
//public ObservableCollection<MasterPageMenuItemModel> MenuItems;
//public DelegateCommand MenuItemSelected;
public MasterPageViewModel()
{
//_navigationService = navigationService;
//MenuItemSelected = new DelegateCommand(OnMenuItemSelected);
//MasterProfileGrayHeaderBounds = new Rectangle(0, 0, 1, 0.175);
//MasterProfileImageBounds = new Rectangle(16, 16, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
//MasterProfileNameBounds = new Rectangle(16, 70, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
//MasterMenuBounds = new Rectangle(16, 100 + 10, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
//MenuItems = new ObservableCollection<MasterPageMenuItemModel>
//{
// new MasterPageMenuItemModel {Name = "GistsPage", ImageSource = GistsPageImagePath},
// new MasterPageMenuItemModel {Name = "IssueDashboardPage", ImageSource = IssueDashboardPageImagePath},
// new MasterPageMenuItemModel {Name = "BookmarksPage", ImageSource = BookmarksPageImagePath},
// new MasterPageMenuItemModel {Name = "ReportAnIssuePage", ImageSource = ReportAnIssuePageImagePath}
//};
}
//private void OnMenuItemSelected()
//{
// if ( MenuItemSelectedProperty == null ) return;
// _navigationService.NavigateAsync(MenuItemSelectedProperty.Name, animated: false);
// MenuItemSelectedProperty = null;
//}
}
}
之前:
using GitRemote.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace GitRemote.ViewModels
{
public class MasterPageViewModel : BindableBase
{
#region Constants
private const string GistsPageImagePath = "ic_code_black_24dp.png";
private const string IssueDashboardPageImagePath = "ic_slow_motion_video_black_24dp.png";
private const string BookmarksPageImagePath = "ic_bookmark_black_24dp.png";
private const string ReportAnIssuePageImagePath = "ic_error_outline_black_24dp.png";
#endregion
#region Bindable properties
private Rectangle _masterProfileGrayHeaderBounds;
public Rectangle MasterProfileGrayHeaderBounds
{
get { return _masterProfileGrayHeaderBounds; }
set { SetProperty(ref _masterProfileGrayHeaderBounds, value); }
}
private Rectangle _masterProfileImageBounds;
public Rectangle MasterProfileImageBounds
{
get { return _masterProfileImageBounds; }
set { SetProperty(ref _masterProfileImageBounds, value); }
}
private Rectangle _masterProfileNameBounds;
public Rectangle MasterProfileNameBounds
{
get { return _masterProfileNameBounds; }
set { SetProperty(ref _masterProfileNameBounds, value); }
}
private Rectangle _masterMenuBounds;
public Rectangle MasterMenuBounds
{
get { return _masterMenuBounds; }
set { SetProperty(ref _masterMenuBounds, value); }
}
private MasterPageMenuItemModel _menuItemSelectedProperty;
public MasterPageMenuItemModel MenuItemSelectedProperty
{
get { return _menuItemSelectedProperty; }
set { SetProperty(ref _menuItemSelectedProperty, value); }
}
#endregion
private readonly INavigationService _navigationService;
public ObservableCollection<MasterPageMenuItemModel> MenuItems;
public DelegateCommand MenuItemSelected;
public MasterPageViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
MenuItemSelected = new DelegateCommand(OnMenuItemSelected);
MasterProfileGrayHeaderBounds = new Rectangle(0, 0, 1, 0.175);
MasterProfileImageBounds = new Rectangle(16, 16, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
MasterProfileNameBounds = new Rectangle(16, 70, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
MasterMenuBounds = new Rectangle(16, 100 + 10, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
MenuItems = new ObservableCollection<MasterPageMenuItemModel>
{
new MasterPageMenuItemModel {Name = "GistsPage", ImageSource = GistsPageImagePath},
new MasterPageMenuItemModel {Name = "IssueDashboardPage", ImageSource = IssueDashboardPageImagePath},
new MasterPageMenuItemModel {Name = "BookmarksPage", ImageSource = BookmarksPageImagePath},
new MasterPageMenuItemModel {Name = "ReportAnIssuePage", ImageSource = ReportAnIssuePageImagePath}
};
}
private void OnMenuItemSelected()
{
if ( MenuItemSelectedProperty == null ) return;
_navigationService.NavigateAsync(MenuItemSelectedProperty.Name, animated: false);
MenuItemSelectedProperty = null;
}
}
}
我评论了所有的东西,但我不知道它发生在哪里以及为什么发生。
图片上是我的调用堆栈。但我不知道它是什么意思,我也无能为力。
在 Prism 中,您可以将参数从当前视图模型发送到您导航的页面视图模型。所以我在发送参数,另一方面我在接收它们。但是,在我打电话给他们之前,我并没有检查他们是否存在。于是就有了 NullReferenceException。