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

本文关键字:动态 按钮 MenuFlyout Phone Windows 应用程序 | 更新日期: 2023-09-27 18:31:57

我正在动态生成一个包含 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)
    {
    }

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

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

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

寻找视觉元素是通过VisualTreeHelper完成的 所有细节都可以在这里找到 https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.visualtreehelper

它的底部有一个很好的代码片段,你可以找到页面上的所有"按钮",然后从该列表中获取具有正确名称的按钮并更改其内容。类似于下面的 UWP:在 c# 代码中更改 ListBoxItem 元素的(文本)样式

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