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

私はあなたの問題を理解しています。これは、アプリケーションのどこにでも追加できるホームボタンを作成する簡単な方法で、ホームに移動します。イベントなどをカスケードする必要はありません。カスタムコントロールを作成するだけです。これは、ユーザーコントロールとは異なります。これは、ボタンコントロールをサブクラス化するだけです。はるかにクリーンなアプローチ。

3つの簡単なステップ。

注:カスタムコントロールは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>

FrameMyUserControl.csに追加します。囲みからプロパティを設定する方法を知るには、他の質問を参照してください。 FramePage

 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 に答える