【问题标题】:Loop an UIElement variable name循环一个 UIElement 变量名
【发布时间】:2015-10-06 10:08:35
【问题描述】:

我尝试在 WPF 应用程序中循环我的食物对象的名称。

我想要以下食物元素的名称:food0、food1、foot2 ...

for (int i = 0; i < foods.Count; i++)
{
    System.Windows.UIElement foodelement = "food" + i; // ERROR here
    Canvas.SetLeft(foodelement, foods[i].Position.X);
}

我得到错误: Cannot implicitly convert type string to System.Windows.UIElement

【问题讨论】:

    标签: c# wpf xaml loops variables


    【解决方案1】:

    这可能对你有帮助

    System.Windows.UIElement foodelement = (System.Windows.UIElement)YourContainer.FindName("food" + i);
    

    YourContainer 是包含 UIElements 的容器(网格/画布/堆栈面板/)。

    否则您可以使用以下内容:

     System.Windows.UIElement foodelement = UIHelper.FindChild<System.Windows.UIElement>(Application.Current.MainWindow, "food" + i);
    

    【讨论】:

    • myCanvas 不包含 .FindControl()
    • 谢谢你不走运。但是 UIHelper 的基类是什么?我找不到它。
    【解决方案2】:

    我认为以下代码会对您有所帮助

    /// <summary>
    /// Finds a Child of a given item in the visual tree. 
    /// </summary>
    /// <param name="parent">A direct parent of the queried item.</param>
    /// <typeparam name="T">The type of the queried item.</typeparam>
    /// <param name="childName">x:Name or Name of child. </param>
    /// <returns>The first parent item that matches the submitted type parameter. 
    /// If not matching item can be found, 
    /// a null parent is being returned.</returns>
    public static T FindChild<T>(DependencyObject parent, string childName)
       where T : DependencyObject
    {
        // Confirm parent and childName are valid. 
        if (parent == null) return null;
    
        T foundChild = null;
    
        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            // If the child is not of the request child type child
            T childType = child as T;
            if (childType == null)
            {
                // recursively drill down the tree
                foundChild = FindChild<T>(child, childName);
    
                // If the child is found, break so we do not overwrite the found child. 
                if (foundChild != null) break;
            }
            else if (!string.IsNullOrEmpty(childName))
            {
                var frameworkElement = child as FrameworkElement;
                // If the child's name is set for search
                if (frameworkElement != null && frameworkElement.Name == childName)
                {
                    // if the child's name is of the request name
                    foundChild = (T)child;
                    break;
                }
            }
            else
            {
                // child element found.
                foundChild = (T)child;
                break;
            }
        }
    
        return foundChild;
    }
    

    并使用这个方法

      for (int i = 0; i < foods.Count; i++)
           {
            System.Windows.UIElement ui = FindChild<Button>(Application.Current.MainWindow, "food" + i);
           }
    

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 2019-07-29
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2019-11-19
      相关资源
      最近更新 更多