1

这是问题所在:

我有一个带有听众的“主页按钮”

    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)
        {
        }

但是该按钮还不起作用。

4

3 回答 3

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="&#xE10F;" 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 的样式。然后你可以拥有相同的视图状态和所有。无论如何,这会让你到达你想要的地方。

因此,这是解决您在问题中描述的问题的主页按钮。它甚至以比您假设的解决方案更少问题的方式解决它 - 因为跨上下文手动冒泡事件可能会导致噩梦。

我希望这有帮助。

于 2013-01-08T21:16:45.260 回答
1

向您的用户控件添加一个按钮,并将Item_Tap事件处理程序附加到它。

<UserControl>
  ....
  <Button  Tapped="GoHome_Tap">Go Home</Button>
 .....
</UserControl>

添加Frame到 MyUserControl.cs。请参阅您的其他问题以了解如何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));
    }
}
于 2013-01-08T17:27:52.193 回答
0

您必须向在按钮的事件处理程序中触发的 UserControl 添加一个事件。您在上面发布的事件仍将在您的用户控件之外定义,除非您将任何“this”传递给 UserControl 的构造函数。

于 2013-01-08T17:00:22.853 回答