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