如何在 windows phone 8.1 应用程序中使用 MenuFlyout 更改动态生成按钮的内容

Posted

技术标签:

【中文标题】如何在 windows phone 8.1 应用程序中使用 MenuFlyout 更改动态生成按钮的内容【英文标题】:how to change content of dynamically generated button with MenuFlyout in windows phone 8.1 application 【发布时间】:2016-05-01 19:49:10 【问题描述】:

我正在生成一个动态包含 MenuFlyout 的按钮。

       public Button createButton(string name, String[] value)
    
        Button bt = new Button();
        bt.Name = name;
        MenuFlyout m = createMenu(value);
       bt.Click +=  (sender, e) =>  Bt_Click(sender, e, m, name); ;

        return bt;
    
private void Bt_Click(object sender, RoutedEventArgs e, MenuFlyout m, string name)
    

        m.ShowAt((FrameworkElement)sender);
        buttonclicked = name;
    

    public MenuFlyout createMenu(string[] value)
    
        MenuFlyout m = new MenuFlyout();
        for (int i = 0; i < value.Length; i++)
        
            MenuFlyoutItem mn = new MenuFlyoutItem();
            mn.Text = value[i];
            mn.Click += Mn_Click;
            m.Items.Add(mn);
        
        return m;
    

    private void Mn_Click(object sender, RoutedEventArgs e)
    

    

现在我希望当单击任何菜单浮出项目时,该按钮应更改其内容。

【问题讨论】:

这样的? ***.com/questions/17540343/… 不,实际上我不知道如何引用该按钮。因为那是动态生成的。 @Barnstokkr 【参考方案1】:

我看到您正在跟踪已单击按钮的名称。有了它,您可以在 xaml 树中搜索它并以这种方式更改内容。

使用VisualTreeHelper 查找视觉元素 所有细节都可以在这里找到https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.visualtreehelper

它的底部有一个很好的代码 sn-p,您可以通过该代码在页面上找到所有“按钮”,然后从该列表中获取具有正确名称的按钮并更改其内容。 类似这样的东西UWP: changing the (text) style of a ListBoxItem Element in c# code

internal static void FindChildren<T>(List<T> results, DependencyObject startNode)
  where T : DependencyObject

    int count = VisualTreeHelper.GetChildrenCount(startNode);
    for (int i = 0; i < count; i++)
    
        DependencyObject current = VisualTreeHelper.GetChild(startNode, i);
        if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T))))
        
            T asType = (T)current;
            results.Add(asType);
        
        FindChildren<T>(results, current);
    

【讨论】:

非常感谢您的帮助,“startNode”应该是什么 这是页面上的另一个 UI 元素...或页面本身。看看另一个 SO 问题的链接,它有一个用法示例 - 它在那里使用一个列表框。但在你的情况下,使用按钮所在的网格(如果有主网格) 好的,谢谢,但它不会更新按钮的内容。虽然调试每件事似乎都是正确的 嗯并在代码中手动更改内容只是为了测试它是否有效?因此,如果您进行调试,您会得到具有“旧”内容值的正确按钮吗? 我已经尝试过硬编码,但它也没有解决这个问题? @Depechie

以上是关于如何在 windows phone 8.1 应用程序中使用 MenuFlyout 更改动态生成按钮的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何调试在 Windows Phone 8.1 上挂起的应用程序

如何在 windows phone 8.1 应用程序中使用 MenuFlyout 更改动态生成按钮的内容

如何将 Windows Phone 8.1 应用程序部署到 Windows 10 移动设备?

如何在 Windows Phone 8.1 XAML (RT) 应用程序中显示 admob 广告?

如何在Windows Phone 8.1运行时应用程序中显示计划的对话框?

Windows Phone 8.1向导控件