Как получить доступ к коду из шаблона планшета / телефона? - PullRequest
1 голос
/ 16 мая 2019

Я занимаюсь проектом с DashboardPage и DashboardPageViewModel, которые связаны через ViewModelLocator DI. Страница Dashboard имеет следующий код, который разделяет элементы Xaml / Code на два отдельных шаблона.

   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");
            }
        }

Я хочу добавить кнопку в xaml Phone / Tablet и обработать логику в DashboardPage. Как сделать ссылку на страницу Dashboard, если эти файлы XAML связаны с отдельным кодом, а не с страницей Dashboard?

Чтобы уточнить, DashboardPage происходит от MenuContainerPage, который позволяет мне входить и выходить из моего слайд-меню. Я хочу обработать эту логику с помощью кнопки, которую я реализовал в макете планшета / телефона.

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Вот как бы я это сделал.

Я бы начал с создания interface с событиями, которые я хочу показать из моего ContentView

Для примера я назову этот интерфейс как IMenuOptionHandler, и он будет выглядеть так

public interface IMenuOptionHandler
{
    event EventHandler OnSlideIn;

    event EventHandler OnSlideOut;
}

Здесь у нас есть два события, которые будут вызываться из наших ContentViews. Вы можете добавить столько, сколько пожелаете.

Затем нам нужно сделать наши ContentViews для реализации этого интерфейса:

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>

В обоих XAML должны быть кнопки и события Clicked, связанные с нашими методами в коде классов.

Эти два метода, единственная цель (на данный момент) состоит в том, чтобы вызвать события и уведомить любого, что он подписан на них, о том, что событие произошло.

Теперь у вас DashboardPage

вы добавите это глобальное свойство для простоты

IMenuOptionHandler MenuOptionHandler => Content as IMenuOptionHandler;

Это приведёт Content Page к значению IMenuOptionHandler. Любой класс, который реализует этот интерфейс, позволит этому приведению произойти.

Последняя часть, добавленная к тому же DashboardPage - это подписка на события. Это произойдет с помощью метода 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 или планшет), ContentPage Dashboard будет уведомлен об этом, и вы сможете выполнить любую задачу, какую пожелаете.

Надеюсь, это поможет .-

0 голосов
/ 16 мая 2019

Предположим, у вас есть кнопка на Page1, сначала дайте имя кнопке на Xaml:

<Button x:Name="btnInPage1" Text="Welcome to Xamarin.Forms!" />

В коде за Page1 создайте свойство кнопки public static для кнопки и установите btnPageOne = btnInPage1:

public partial class Page1 : ContentPage
{

    public static Button btnPageOne;
    public Page1 ()
    {
        InitializeComponent ();

        btnPageOne = btnInPage1;

    }
}

Затем в вашем DashboardPage вы можете получить доступ к кнопке с помощью Page1.btnPageOne и обработать логику с помощью:

Page1.btnPageOne.Clicked += delegate {

    Console.WriteLine("Page1 btn clicked");

};

То же самое, если у вас естьСтраница 2, Страница 3 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...