2016-04-16 8 views
1

これはルーキーのXAMLに関する質問ですが、ここに入ります。私が何をしたいかFlyout内のボタンからフライアウトにアクセスするXAML

私はWindowsの携帯電話8.1ア​​プリケーションを開発していますが、私は、カスタムフライアウトに機能を追加するようにしたいでフライアウト2回に同じメニューボタンをクリックします行は、フライアウトを閉じます。 例:ユーザーがフライアウトの[設定に移動]メニュー項目をクリックします。ユーザーがもう一度クリックすると、すでに設定メニューに入っているので、代わりにフライアウトを閉じるだけです。

問題: 私の問題は、私はそれの内側ボタンがクリックされたときに、フライアウト内のコードを呼び出すことができるようにいくつかの方法が必要だということです。私はMVVMCrossとXamarinで作業しているので、コードビハインドを行うオプションはありません(そして、Windows Phoneの特定のロジックを汎用プラットフォームのビューモデルに移動したくありません)。

がこれまでにしようとしました: を私はボタンから継承するカスタムボタンを作成することによってこれを固定しようとしています。ボタンがロードされると、イベントがタップされたイベントにサブスクライブされます。これが起こると、ボタンの親(および親の親)を再帰的に見て、見つかるまでフライアウトのハンドルを取得しようとします。 ...私は親としてフライアウトを得ることができないので、これはうまくいかず、フライアウトプレゼンター(自分のカスタムフライアウトにアクセスできない)が得られたので、ここで必要な機能を呼び出すことができませんでした。

私はButtonから継承するカスタムの "FlyoutButton"を作成しようとしました。このボタンには、XAMLで設定できるFlyoutのDependencyPropertyがあります。そのため、ボタン内のフライアウトに対するハンドルがあります。 しかし、これをやろうとすると、「System.VoidはC#から使用できません」という例外が発生しますが、実際にはわかりません。以下は私のコードの見た目です。

マイコード: XAMLスニペット:

<Button.Flyout> 
    <controls:MainMenuFlyout x:Name="test" 
     <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <controls:MainMenuButton MainMenuFlyout="{Binding ElementName=test}" Grid.Row="0"/> 
     <controls:MainMenuButton MainMenuFlyout="{Binding ElementName=test}" Grid.Row="0"/> 
     <controls:MainMenuButton MainMenuFlyout="{Binding ElementName=test}" Grid.Row="0"/> 
    <controls:MainMenuFlyout /> 
<Button.Flyout /> 

のC#:

public class MainMenuButton : Button 
    { 
     public static DependencyProperty MainMenuFlyoutProperty = DependencyProperty.Register("MainMenuFlyout", typeof(MainMenuFlyout), typeof(MainMenuButton), new PropertyMetadata(string.Empty, MainMenuFlyoutPropertyChangedCallback)); 

     public static void SetMainMenuFlyout(UIElement element, MainMenuFlyout value) 
     { 
      element.SetValue(MainMenuFlyoutProperty, value); 
     } 

     public MainMenuFlyout GetMainMenuFlyout(UIElement element) 
     { 
      return (MainMenuFlyout)element.GetValue(MainMenuFlyoutProperty); 
     } 

     private static void MainMenuFlyoutPropertyChangedCallback(DependencyObject dependencyObject, 
      DependencyPropertyChangedEventArgs e) 
     { 
     } 
    } 
+1

あなたの依存関係プロパティの宣言が間違っています。静的なgetterメソッドとsetterメソッドを宣言するのではなく、GetValueとSetValueを呼び出すgetter/setterで 'public MainMenuFlyout MainMenuFlyout'プロパティを宣言する必要があります。 – Clemens

+1

さらに、 'string.Empty'は、MainMenuFlyout型のプロパティの無効なデフォルト値です。 – Clemens

+0

ありがとう!あなたはあなたの意見に正直であり、変更はうまくいった! – oPolo

答えて

1

依存関係プロパティの宣言が間違っています。代わりにstring.Emptyの、デフォルトのプロパティ値として、通常のプロパティラッパーの代わりに、静的なgetterメソッドとsetterメソッド、およびnullで、次のようになります:

public static DependencyProperty MainMenuFlyoutProperty = 
    DependencyProperty.Register(
     "MainMenuFlyout", typeof(MainMenuFlyout), typeof(MainMenuButton), 
     new PropertyMetadata(null, MainMenuFlyoutPropertyChangedCallback)); 

public MainMenuFlyout MainMenuFlyout 
{ 
    get { return (MainMenuFlyout)GetValue(MainMenuFlyoutProperty); } 
    set { SetValue(MainMenuFlyoutProperty, value); } 
} 
関連する問題