C# 创建一个按钮并调用我的MasterDetailPage.Detail中的视图
在我的C# 创建一个按钮并调用我的MasterDetailPage.Detail中的视图,c#,xaml,xamarin.forms,C#,Xaml,Xamarin.forms,在我的MasterDetailPage.Detail中,我有默认代码,我想做一些更改,而是有一个导航页面,我想有一个ContentPage来创建一个按钮,显示在我的所有页面中,但我不能同时调用函数和 默认代码如下所示: <MasterDetailPage.Detail> <NavigationPage> <NavigationPage.Icon> <OnPlatform x:Type
MasterDetailPage.Detail中,我有默认代码,我想做一些更改,而是有一个导航页面,我想有一个ContentPage来创建一个按钮,显示在我的所有页面中,但我不能同时调用函数
和
默认代码如下所示:
<MasterDetailPage.Detail>
<NavigationPage>
<NavigationPage.Icon>
<OnPlatform x:TypeArguments="FileImageSource">
<On Platform="iOS" Value="tab_feed.png"/>
</OnPlatform>
</NavigationPage.Icon>
<x:Arguments>
<views:ItemsPage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
<MasterDetailPage.Detail>
<ContentPage>
<ContentPage.Content>
<Button Text="Hello World!" />
<views:ItemsPage />
</ContentPage.Content>
</ContentPage>
</MasterDetailPage.Detail>
我想要这样的东西:
<MasterDetailPage.Detail>
<NavigationPage>
<NavigationPage.Icon>
<OnPlatform x:TypeArguments="FileImageSource">
<On Platform="iOS" Value="tab_feed.png"/>
</OnPlatform>
</NavigationPage.Icon>
<x:Arguments>
<views:ItemsPage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
<MasterDetailPage.Detail>
<ContentPage>
<ContentPage.Content>
<Button Text="Hello World!" />
<views:ItemsPage />
</ContentPage.Content>
</ContentPage>
</MasterDetailPage.Detail>
MainPage.xaml.cs
public partial class MainPage : MasterDetailPage
{
SortedDictionary<int, Category> categorias = new SortedDictionary<int, Category>();
Dictionary<int, NavigationPage> MenuPages = new Dictionary<int, NavigationPage>();
private int posicao = 0;
public MainPage()
{
InitializeComponent();
MasterBehavior = MasterBehavior.Popover;
//MenuPages.Add((int)MenuItemType.Browse, (NavigationPage)Detail);
}
public async Task NavigateFromMenu(int id)
{
if (!MenuPages.ContainsKey(id))
{
switch (id)
{
case (int)MenuItemType.Browse:
MenuPages.Add(id, new NavigationPage(categorias[posicao].Page));
break;
case (int)MenuItemType.About:
MenuPages.Add(id, new NavigationPage(new AboutPage()));
break;
}
}
var newPage = MenuPages[id];
if (newPage != null && Detail != newPage)
{
Detail = newPage;
if (Device.RuntimePlatform == Device.Android)
await Task.Delay(100);
IsPresented = false;
}
}
}
public partial class ItemsPage : ContentPage
{
Dictionary<int, Models.Category> _categorias;
ItemsViewModel viewModel;
public ItemsPage()
{
InitializeComponent();
BindingContext = viewModel = new ItemsViewModel();
}
public ItemsPage(Dictionary<int, Models.Category> categorias)
{
InitializeComponent();
_categorias = categorias;
BindingContext = viewModel = new ItemsViewModel();
}
async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
{
var item = args.SelectedItem as Models.Category;
if (item == null)
return;
var selected = _categorias.GetOrAdd(item.Id, item);
}
async void AddItem_Clicked(object sender, EventArgs e)
{
await Navigation.PushModalAsync(new NavigationPage(new NewItemPage()));
}
protected override void OnAppearing()
{
base.OnAppearing();
if (viewModel.Items.Count == 0)
viewModel.LoadItemsCommand.Execute(null);
}
}
public static class DictionaryGetOrAdd
{
public static V GetOrAdd<K, V>(this Dictionary<K, V> dict, K key, V value)
{
if (!dict.ContainsKey(key))
dict.Add(key, value);
return value;
}
}
公共部分类主页面:MasterDetailPage
{
SortedDictionary categorias=新的SortedDictionary();
字典菜单页=新字典();
私有int posicao=0;
公共主页()
{
初始化组件();
MasterBehavior=MasterBehavior.Popover;
//添加((int)MenuItemType.Browse,(NavigationPage)详细信息);
}
公共异步任务导航菜单(int-id)
{
如果(!MenuPages.ContainsKey(id))
{
开关(id)
{
案例(int)MenuItemType.Browse:
添加(id,新导航页面(分类为[posicao].Page));
打破
案例(int)MenuItemType.About:
添加(id,新导航页面(newaboutpage());
打破
}
}
var newPage=MenuPages[id];
if(newPage!=null&&Detail!=newPage)
{
细节=新页面;
if(Device.RuntimePlatform==Device.Android)
等待任务。延迟(100);
IsPresented=假;
}
}
}
ItemPage.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="RestaurantManagerUI.Views.ItemsPage"
Title="{Binding Title}"
x:Name="BrowseItemsPage">
<ContentPage.ToolbarItems>
<ToolbarItem Text="Add" Clicked="AddItem_Clicked">
<ToolbarItem.Icon>
<OnPlatform x:TypeArguments="FileImageSource">
<On Platform="UWP" Value="add.png"/>
</OnPlatform>
</ToolbarItem.Icon>
</ToolbarItem>
</ContentPage.ToolbarItems>
<StackLayout>
<ListView x:Name="ItemsListView"
ItemsSource="{Binding Items}"
VerticalOptions="FillAndExpand"
HasUnevenRows="true"
RefreshCommand="{Binding LoadItemsCommand}"
IsPullToRefreshEnabled="true"
IsRefreshing="{Binding IsBusy, Mode=OneWay}"
CachingStrategy="RecycleElement"
ItemSelected="OnItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Padding="10">
<Label Text="{Binding Id}"
LineBreakMode="NoWrap"
Style="{DynamicResource ListItemTextStyle}"
FontSize="16" />
<Label Text="{Binding Name}"
LineBreakMode="NoWrap"
Style="{DynamicResource ListItemDetailTextStyle}"
FontSize="13" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
ItemPage.xaml.cs
public partial class MainPage : MasterDetailPage
{
SortedDictionary<int, Category> categorias = new SortedDictionary<int, Category>();
Dictionary<int, NavigationPage> MenuPages = new Dictionary<int, NavigationPage>();
private int posicao = 0;
public MainPage()
{
InitializeComponent();
MasterBehavior = MasterBehavior.Popover;
//MenuPages.Add((int)MenuItemType.Browse, (NavigationPage)Detail);
}
public async Task NavigateFromMenu(int id)
{
if (!MenuPages.ContainsKey(id))
{
switch (id)
{
case (int)MenuItemType.Browse:
MenuPages.Add(id, new NavigationPage(categorias[posicao].Page));
break;
case (int)MenuItemType.About:
MenuPages.Add(id, new NavigationPage(new AboutPage()));
break;
}
}
var newPage = MenuPages[id];
if (newPage != null && Detail != newPage)
{
Detail = newPage;
if (Device.RuntimePlatform == Device.Android)
await Task.Delay(100);
IsPresented = false;
}
}
}
public partial class ItemsPage : ContentPage
{
Dictionary<int, Models.Category> _categorias;
ItemsViewModel viewModel;
public ItemsPage()
{
InitializeComponent();
BindingContext = viewModel = new ItemsViewModel();
}
public ItemsPage(Dictionary<int, Models.Category> categorias)
{
InitializeComponent();
_categorias = categorias;
BindingContext = viewModel = new ItemsViewModel();
}
async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
{
var item = args.SelectedItem as Models.Category;
if (item == null)
return;
var selected = _categorias.GetOrAdd(item.Id, item);
}
async void AddItem_Clicked(object sender, EventArgs e)
{
await Navigation.PushModalAsync(new NavigationPage(new NewItemPage()));
}
protected override void OnAppearing()
{
base.OnAppearing();
if (viewModel.Items.Count == 0)
viewModel.LoadItemsCommand.Execute(null);
}
}
public static class DictionaryGetOrAdd
{
public static V GetOrAdd<K, V>(this Dictionary<K, V> dict, K key, V value)
{
if (!dict.ContainsKey(key))
dict.Add(key, value);
return value;
}
}
public分部类ItemsPage:ContentPage
{
字典分类;
ItemsViewModel视图模型;
公共项目
{
初始化组件();
BindingContext=viewModel=newitemsviewmodel();
}
公共项目集(字典分类)
{
初始化组件();
_分类=分类;
BindingContext=viewModel=newitemsviewmodel();
}
已选择异步(对象发送方,SelectedItemChangedEventArgs args)
{
var item=args.SelectedItem作为Models.Category;
如果(项==null)
返回;
所选变量=_categorias.GetOrAdd(item.Id,item);
}
已单击异步无效添加项(对象发送方,事件参数e)
{
wait Navigation.PushModalAsync(new NavigationPage(new NewItemPage());
}
出现时受保护的覆盖无效()
{
base.OnAppearing();
if(viewModel.Items.Count==0)
viewModel.LoadItemsCommand.Execute(null);
}
}
公共静态类字典getoradd
{
公共静态V GetOrAdd(此字典dict dict,K键,V值)
{
如果(!dict.ContainsKey(键))
dict.Add(键、值);
返回值;
}
}
但在最后一段代码中,有两个错误:“属性'Content'设置了多次”和“属性'Content'不支持'ItemsPage'类型的值”。
如何管理它?ContentPage.Content
只能有一个直接子项,所以只需将其全部包装在堆栈布局中即可
<ContentPage>
<ContentPage.Content>
<StackLayout>
<Button Text="Hello World!" />
<views:ItemsPage />
</StackLayout>
</ContentPage.Content>
</ContentPage>
您可以先在XAML中创建详细信息页面。然后使用代码隐藏添加项目页面。
以下是XAML代码:
<MasterDetailPage.Detail>
<ContentPage>
<StackLayout x:Name="ContentLayout">
<Button Text="Hello World!"/>
</StackLayout>
</ContentPage>
</MasterDetailPage.Detail>
您需要将当前版面的绑定上下文设置为ItemsViewModel
,而不是在ItemsPage
的构造函数中进行设置。视图:ItemsPage
这是一个ContentPage@哈基姆:是的。是否要查看ItemsPage代码?不需要它不起作用的原因是您无法将ContentPage
嵌入到另一个网页中您可能希望将其转换为ContentView
,顺便说一句,它不支持另一个内部的ContentPage,因为ContentPage
不是ViewRenderer
Ok类型。我已将ItemsPage更改为ContentView
,但出现了相同的错误。哦,抱歉,我没有注意到,但是内容只需要一个孩子就可以把它放到一个StackLayout
检查一下我的答案,让我简单地了解一下。啊,是的,哦,我的天,我太傻了。但在
中,它给了我另一个错误:“ItemsPage”类型的值不能添加到“IList”类型的集合或字典中。这可能是因为我的ItemsPage代码现在正确吗?好的,我发现了错误,所以我有很多代码包括此页面,所以我无法将ItemsPage更改为ContentView。是否有其他方法来声明
?为什么不能将其更改为ContentView?是否可以为问题添加更多详细信息现在我的代码中没有任何错误,但当我尝试运行时出现此错误:XamlCTask”任务意外失败代码>类似于此,但添加按钮来代替工具栏项:关于BindingContext是这样做的:公共类ItemsViewModel:BaseViewModel{pulbic ItemsViewModel BindingContext{get;set;}pulbic ItemsViewModel(){BindingContext=new ItemsVi