问题在于:
我有一个带有听众的“主页按钮”
private void Item_Tap(object sender, TappedRoutedEventArgs e)
{
if (this.Frame != null)
{
this.Frame.Navigate(typeof(Home));
}
}
如果我使用其中的“主页按钮”构建了用户控件,我该如何完成相同的导航?
**我接近解决方案**。 这是用户控件:
public sealed partial class TopBarControl : UserControl
{
public Frame Frame { get; set; }
public object Parameter { get; set; }
public TopBarControl(Frame frame)
{
this.InitializeComponent();
this.Frame = frame;
var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
var dateAndTime = DateTime.Now;
Date.Text = dateAndTime.Date.ToString("MM/dd/yyyy");
User.Text = localSettings.Values["userName"].ToString();
//SectionTitle.Text = Parameter.ToString();
}
private void GoHome_Tap(object sender, TappedRoutedEventArgs e)
{
if (this.Frame != null)
{
this.Frame.Navigate(typeof(Main_Menu));
}
}
}
在xaml用户控件上我有:
<Button Grid.Column="0" HorizontalAlignment="Right" BorderThickness="0">
<Image Source="/Assets/home_icon.png" Tapped="GoHome_Tap"/>
</Button>
与用户控件关联的页面
public WantedVehicles()
{
this.InitializeComponent();
}
private TopBarControl topBarControl;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Tit.Text = e.Parameter.ToString();
topBarControl.Frame = this.Frame;
topBarControl.Parameter = e.Parameter;
}
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
}
protected override void SaveState(Dictionary<String, Object> pageState)
{
}
但按钮不起作用。
答案 0 :(得分:9)
我理解你的问题。这是一种创建主页按钮的简单方法,您可以在应用程序的任何位置添加该按钮,它将导航回家。无需级联事件或类似的事情。只需创建一个自定义控件。 这与用户控件不同。这只是按钮控件的子类。方法更加清洁。
三个简单的步骤。
注意:我的自定义控件将被称为HomeButton,我的主页类将被称为HomePage。除此之外,这应该是开箱即用的。
首先,定义按钮的外观:
<!-- custom home button -->
<Style TargetType="local:HomeButton" BasedOn="{StaticResource BackButtonStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid Height="48" Width="48">
<Ellipse Stroke="White" StrokeThickness="2" />
<TextBlock Text="" FontSize="20"
VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
其次,像这样定义你的自定义控件:
public sealed class HomeButton : Button
{
public HomeButton()
{
this.DefaultStyleKey = this.GetType();
this.Click += HomeButton_Click;
}
void HomeButton_Click(object sender, RoutedEventArgs e)
{
var _Frame = Window.Current.Content as Frame;
var _Type = typeof(HomePage);
_Frame.Navigate(_Type);
}
}
第三,最后,将您的主页按钮添加到您的应用程序中!
<local:HomeButton HorizontalAlignment="Left" VerticalAlignment="Top" Margin="40" />
以下是它的外观:
它甚至有效! :)如果你想更多地设置按钮的样式,很容易在/Common/StandardStyles.xaml文件中窃取BackButtonStyle的样式。然后你可以拥有相同的View States和all。无论如何,这会让你到达你想要的地方。
所以,这是主页按钮,可以解决您在问题中描述的问题。它甚至以比您假设的解决方案更少问题的方式解决它 - 因为在上下文中手动冒泡事件可能会导致噩梦。
我希望这会有所帮助。
答案 1 :(得分:1)
向用户控件添加一个按钮,并将Item_Tap
事件处理程序附加到其中。
<UserControl>
....
<Button Tapped="GoHome_Tap">Go Home</Button>
.....
</UserControl>
将Frame
添加到MyUserControl.cs。请参阅other question,了解如何设置Frame
属性并将其封闭Page
。
public TopBarControl:UserControl
{
public Frame Frame {get;set;} // To be set in either OnNavigatedTo, or in Constructor.
}
将事件处理程序添加到MyUserControl.cs
private void GoHome_Tap(object sender, TappedRoutedEventArgs e)
{
if (this.Frame != null)
{
this.Frame.Navigate(typeof(Home));
}
}
答案 2 :(得分:0)
您必须向按钮的事件处理程序中触发的UserControl添加一个事件。您在上面发布的事件仍将在用户控件之外定义,除非您将“this”传递给UserControl的构造函数。