Вот как бы я это сделал.
Я бы начал с создания 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 будет уведомлен об этом, и вы сможете выполнить любую задачу, какую пожелаете.
Надеюсь, это поможет .-