Xaml 如何从平板电脑/手机模板访问隐藏代码?
我正在接管一个带有仪表板页面和仪表板页面ViewModel的项目,它们通过DI的ViewModelLocator链接。仪表板页面有以下代码,将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
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");
}