我觉得这是一个新秀的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)
{
}
}
答案 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); }
}