Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml 如何从平板电脑/手机模板访问隐藏代码?_Xaml_Xamarin_Xamarin.forms - Fatal编程技术网

Xaml 如何从平板电脑/手机模板访问隐藏代码?

Xaml 如何从平板电脑/手机模板访问隐藏代码?,xaml,xamarin,xamarin.forms,Xaml,Xamarin,Xamarin.forms,我正在接管一个带有仪表板页面和仪表板页面ViewModel的项目,它们通过DI的ViewModelLocator链接。仪表板页面有以下代码,将Xaml/代码分隔为两个单独的模板 private void SetContent() { Debug.WriteLine("Dashboardpage setContent"); switch(Device.Idiom) { c

我正在接管一个带有仪表板页面和仪表板页面ViewModel的项目,它们通过DI的ViewModelLocator链接。仪表板页面有以下代码,将Xaml/代码分隔为两个单独的模板

   private void SetContent()
        {
            Debug.WriteLine("Dashboardpage setContent");

            switch(Device.Idiom)
            {
                case TargetIdiom.Phone:
                    Content = new PrimaryPhoneLayout
                    {
                        RegionContent = RegionContent
                    };
                    break;
                case TargetIdiom.Tablet:
                    Content = new PrimaryTabletLayout(deviceDisplay)
                    {
                        RegionContent = RegionContent
                    };
                    break;
                default:
                    throw new NotSupportedException($"{Device.Idiom} is not a supported idom");
            }
        }
我想在Phone/Tablet xaml中添加一个按钮,并在DashboardPage中处理逻辑。当这些XAML文件链接到各自的代码隐藏而不是仪表板页面时,如何引用仪表板页面


为了进一步说明,DashboardPage源自MenuContainerPage,它允许我滑入/滑出幻灯片菜单。我想通过在平板电脑/手机布局中实现的按钮来处理此逻辑。

假设您在第1页中有一个按钮,首先在Xaml中为该按钮命名:

<Button x:Name="btnInPage1" Text="Welcome to Xamarin.Forms!" />
然后,在
仪表板页面
,您可以使用
Page1.btnPageOne
访问该按钮,并使用以下命令处理逻辑:

Page1.btnPageOne.Clicked += delegate {

    Console.WriteLine("Page1 btn clicked");

};

如果你有第2页,第3页,也是一样…

我会这样做

首先,我将创建一个
界面
,其中包含我想从我的
ContentView

对于示例,我将此接口称为
IMenuOptionHandler
,如下所示

public interface IMenuOptionHandler
{
    event EventHandler OnSlideIn;

    event EventHandler OnSlideOut;
}
这里有两个事件将从ContentView调用。你可以随意添加

然后,我们需要创建ContentView来实现此接口:

public partial class PrimaryPhoneLayouts : ContentView, IMenuOptionHandler
{
    //...

    #region "IMenuOptionHandler implementation"
    public event EventHandler OnSlideIn;

    public event EventHandler OnSlideOut;
    #endregion

    void OnSlideInButtonClicked(object sender, EventArgs e)
    {
        OnSlideIn?.Invoke(this, EventArgs.Empty);
    }

    void OnSlideOutButtonClicked(object sender, EventArgs e)
    {
        OnSlideOut?.Invoke(this, EventArgs.Empty);
    }
}

public partial class PrimaryTabletLayout : ContentView, IMenuOptionHandler
{
    // ...

    #region "IMenuOptionHandler implementation"
    public event EventHandler OnSlideIn;

    public event EventHandler OnSlideOut;
    #endregion

    void OnSlideInButtonClicked(object sender, EventArgs e)
    {
        OnSlideIn?.Invoke(this, EventArgs.Empty);
    }

    void OnSlideOutButtonClicked(object sender, EventArgs e)
    {
        OnSlideOut?.Invoke(this, EventArgs.Empty);
    }
正如您所看到的,这两个类都在实现我们的接口

此外,我还添加了两组方法,这些方法将与XAML上的按钮挂钩

让我们假设您的XAML如下所示:

<ContentView.Content>
    <StackLayout Orientation="Vertical" 
                 HorizontalOptions="FillAndExpand">
        <Button Text="SlideIn" 
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="FillAndExpand" 
                Clicked="OnSlideInButtonClicked" />
        <Button Text="SlideOut" 
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="FillAndExpand" 
                Clicked="OnSlideOutButtonClicked" />           
    </StackLayout>
</ContentView.Content>
这将把页面的内容强制转换为
IMenuOptionHandler
,无论值是什么。实现此接口的任何类都将允许进行此转换

在同一
仪表板页面上添加的最后一部分是对事件的订阅。这些将发生在
OnAppearing
方法中,我们将取消订阅
OnDisappearing

protected override void OnAppearing()
{
    base.OnAppearing();

    if (MenuOptionHandler != null)
    {
        MenuOptionHandler.OnSlideIn += MenuOptionHandler_OnSlideIn;
        MenuOptionHandler.OnSlideOut += MenuOptionHandler_OnSlideOut;
    }
}

protected override void OnDisappearing()
{
    base.OnDisappearing();

    if (MenuOptionHandler != null)
    {
        MenuOptionHandler.OnSlideIn -= MenuOptionHandler_OnSlideIn;
        MenuOptionHandler.OnSlideOut -= MenuOptionHandler_OnSlideOut;
    }
}

void MenuOptionHandler_OnSlideIn(object sender, EventArgs e)
{
    //Logic to handle the SlideIn
    Debug.WriteLine("MenuOptionHandler_OnSlideIn");
}

void MenuOptionHandler_OnSlideOut(object sender, EventArgs e)
{
    //Logic to handle the SlideOut
    Debug.WriteLine("MenuOptionHandler_OnSlideOut");
}
现在,无论何时单击
ContentView
(iPhone或平板电脑)上的按钮之一,都会通知仪表板内容页面,您可以执行任何想要执行的任务


希望这有帮助。-

从上面的代码看,必须存在两个类:
PrimaryPhoneLayout
PrimaryTabletLayout
,它们负责
仪表板页面上的所有UI。这两个类将具有代码中的UI或具有对应的XAML文件。很抱歉,我无法添加更多内容,但您提供的信息不够。@pinedax是的,这是正确的。上面显示的代码位于DashboardPage.cs中。这些布局文件有自己的xaml.cs文件,我可以在其中处理按钮的输入。但是,我希望处理DashboardPage.cs中的逻辑,因为我可以从中访问要隐藏的菜单。谢谢你的帮助!
IMenuOptionHandler MenuOptionHandler => Content as IMenuOptionHandler;
protected override void OnAppearing()
{
    base.OnAppearing();

    if (MenuOptionHandler != null)
    {
        MenuOptionHandler.OnSlideIn += MenuOptionHandler_OnSlideIn;
        MenuOptionHandler.OnSlideOut += MenuOptionHandler_OnSlideOut;
    }
}

protected override void OnDisappearing()
{
    base.OnDisappearing();

    if (MenuOptionHandler != null)
    {
        MenuOptionHandler.OnSlideIn -= MenuOptionHandler_OnSlideIn;
        MenuOptionHandler.OnSlideOut -= MenuOptionHandler_OnSlideOut;
    }
}

void MenuOptionHandler_OnSlideIn(object sender, EventArgs e)
{
    //Logic to handle the SlideIn
    Debug.WriteLine("MenuOptionHandler_OnSlideIn");
}

void MenuOptionHandler_OnSlideOut(object sender, EventArgs e)
{
    //Logic to handle the SlideOut
    Debug.WriteLine("MenuOptionHandler_OnSlideOut");
}