从Flyout XAML中的按钮访问弹出窗口

时间:2016-04-16 14:39:35

标签: c# windows xaml windows-phone-8.1

我觉得这是一个新秀的XAML问题,但现在就这样了。

我想做什么: 我正在开发一个Windows Phone 8.1应用程序,我想在自定义弹出窗口中添加功能,以便连续两次单击弹出窗口中的相同菜单按钮,关闭弹出按钮。 示例:用户单击"转到设置"弹出窗口中的菜单项。如果用户现在再次单击它,则意味着我们已经在设置菜单中,因此我只想关闭弹出窗口。

问题: 我的问题是,当点击其中的按钮时,我需要一些方法来调出弹出窗口内的代码。我没有选择在这里做任何代码隐藏,因为我正在使用MVVMCross和Xamarin(我不想将Windows-phone特定的逻辑移动到通用的所有平台视图模型中)。

到目前为止尝试过: 我试过通过制作一个继承自Button的自定义按钮来解决这个问题。当按钮加载时,事件将订阅其抽头事件。当发生这种情况时,我会尝试通过递归查看按钮的父级(然后是父级的父级)来获取弹出窗口的句柄,直到找到它为止。 ...这没用,因为我从来没有把Flyout作为父母,而是我得到一个Flyout-presenter(它不能让我访问我的自定义弹出窗口),所以我无法调用我想要的功能。

我尝试过定制" FlyoutButton"继承自Button。这个按钮有一个可以在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 个答案:

答案 0 :(得分:1)

依赖项属性声明是错误的。应该是这样的,使用常规属性包装而不是静态getter和setter方法,并null作为默认属性值,而不是string.Empty

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