Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态创建StackPanel并在代码隐藏中引用其中任何一个_C#_Wpf_Xaml_Uwp - Fatal编程技术网

C# 动态创建StackPanel并在代码隐藏中引用其中任何一个

C# 动态创建StackPanel并在代码隐藏中引用其中任何一个,c#,wpf,xaml,uwp,C#,Wpf,Xaml,Uwp,以最简单的形式 我想创建尽可能多的StackPanel,然后在其中添加矩形。然后,当我点击开始按钮时,可以改变任何一个矩形的填充颜色。一切都在代码背后 任何帮助都将不胜感激 例如,如果我们最喜欢的啤酒编写了框架,我可以这样做: XAML: 代码隐藏: namespace Test2 { public sealed partial class MainPage : Page { public MainPage() { th

以最简单的形式

我想创建尽可能多的StackPanel,然后在其中添加矩形。然后,当我点击开始按钮时,可以改变任何一个矩形的填充颜色。一切都在代码背后

任何帮助都将不胜感激

例如,如果我们最喜欢的啤酒编写了框架,我可以这样做:

XAML:


代码隐藏:

namespace Test2
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

            for (var i = 0; i < 5; i++) // The 5 here could be any number
            {
                myStackPanel.Children.Add(new StackPanel
                {
                    Name = "myPanel" + i,
                    Orientation = Orientation.Horizontal
                });

                for (var j = 0; j < 10; j++) // The 10 here could be any number
                {
                    ("myPanel" + i).Children.Add(new Rectangle
                    {
                        Name = "myRectangle" + i + "-" + j,
                        Fill = new SolidColorBrush(Colors.Black),
                        Width = 20,
                        Height = 20,
                        Margin = new Thickness(1)
                    });
                }
            }
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            // E.G. To change the Fill color of Rectangle4 in StackPanel2

            ("myRectangle" + 2 + "-" + 4).Fill = new SolidColorBrush(Colors.Red);
        }
    }
}
namespace Test2
{
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
for(var i=0;i<5;i++)//这里的5可以是任何数字
{
myStackPanel.Children.Add(新StackPanel
{
Name=“myPanel”+i,
方向=方向。水平
});
for(var j=0;j<10;j++)//这里的10可以是任何数字
{
(“myPanel”+i).Children.Add(新矩形)
{
Name=“myRectangle”+i+“-”+j,
填充=新的SolidColorBrush(颜色为黑色),
宽度=20,
高度=20,
余量=新厚度(1)
});
}
}
}
私有无效开始按钮单击(对象发送者,路由目标)
{
//例如,更改StackPanel2中矩形4的填充颜色
(“myRectangle”+2+“-”+4.Fill=新的SolidColorBrush(Colors.Red);
}
}
}

首先,要添加矩形形状,我们可以创建StackPanel的实例并操作其子元素:

for (var i = 0; i < 5; i++) // The 5 here could be any number
{
                StackPanel sp = new StackPanel
                {
                    Name = "myPanel" + i,
                    Orientation = Orientation.Horizontal
                };
                myStackPanel.Children.Add(sp);

                for (var j = 0; j < 10; j++) // The 10 here could be any number
                {
                    sp.Children.Add(new Rectangle
                    {
                        Name = "myRectangle" + i + "-" + j,
                        Fill = new SolidColorBrush(Colors.Black),
                        Width = 20,
                        Height = 20,
                        Margin = new Thickness(1)
                    });
                }
}
for(var i=0;i<5;i++)//这里的5可以是任何数字
{
StackPanel sp=新的StackPanel
{
Name=“myPanel”+i,
方向=方向。水平
};
myStackPanel.Children.Add(sp);
for(var j=0;j<10;j++)//这里的10可以是任何数字
{
sp.Children.Add(新矩形
{
Name=“myRectangle”+i+“-”+j,
填充=新的SolidColorBrush(颜色为黑色),
宽度=20,
高度=20,
余量=新厚度(1)
});
}
}
然后,当我点击开始按钮时,可以改变任何一个矩形的填充颜色。一切都在代码背后

正如tgpdyk提到的,我们需要使用VisualTreeHelper来查找指定的矩形形状

助手类:

public static class FrameworkElementExtensions
{
        public static T TraverseCTFindShape<T>(DependencyObject root, String name) where T : Windows.UI.Xaml.Shapes.Shape
        {
            T control = null;

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
            {
                var child = VisualTreeHelper.GetChild(root, i);

                string childName = child.GetValue(FrameworkElement.NameProperty) as string;
                control = child as T;

                if (childName == name)
                {
                    return control;
                }
                else
                {
                    control = TraverseCTFindShape<T>(child, name);

                    if (control != null)
                    {
                        return control;
                    }
                }
            }

            return control;
        }
}
公共静态类FrameworkElementExtensions
{
公共静态T TraverseCFindShape(DependencyObject根,字符串名称),其中T:Windows.UI.Xaml.Shapes.Shape
{
T控制=null;
for(int i=0;i
如何使用它:

private void StartButton_Click(object sender, RoutedEventArgs e)
{
            // E.G. To change the Fill color of Rectangle4 in StackPanel2
            var rec = FrameworkElementExtensions.TraverseCTFindShape<Shape>(myStackPanel, "myRectangle" + 2 + "-" + 4);
            rec.Fill = new SolidColorBrush(Colors.Red);
}
private void StartButton_单击(对象发送器,路由目标)
{
//例如,更改StackPanel2中矩形4的填充颜色
var rec=FrameworkElementExtensions.TraverseCTFindShape(myStackPanel,“myRectangle”+2+“-”+4);
rec.Fill=新的SolidColorBrush(颜色为红色);
}

我已经将我的示例上载到了

这根本不是您在WPF中处理此问题的方式

您通常不关心任何UI组件,只关心数据。在这种情况下,可以将数据绑定到行列表,每行包含一个单元格列表。然后在
ItemsControl
定义中,设置包含另一个绑定到单元格的
ItemsControl
的。在嵌套的
ItemsControl
中,您可以设置一个
itemstemplate
,将
Background
绑定到单元格的()属性,然后只需在代码中更改该属性

查看以下概述:


您可能还需要查看模型-视图-模型模式,以确保合适的应用程序体系结构。

这将指导您。。您只需要以在添加和修改属性时限定名称的方式对其进行修改。当然,您应该使用VisualTreeHelper。好的,谢谢@tgpdyk,我会检查它。@tgpdyk我在尝试以下任何一种方法时似乎遇到了错误:参数1:无法从“Windows.UI.Composition.Visual”转换为“Windows.UI.Xaml.DependencyObject”-我在引用其他文档时经常会发现这一点。你(或任何人)能说得更具体一点吗-这里的新手:(@gaw抱歉,我没有意识到这是uwp,我不熟悉那个平台,所以这个答案可能不相关,所以我要删除它。(我在一个普通的WPF桌面应用程序上测试过这个,它确实在那里工作)。这将是一个。虽然不是所有的东西都应该是相似的,但大多数都应该是相似的。谢谢你在这里的输入。我将@Franklin Chen-MSFT标记为答案,因为它非常明确地回答了我的问题。然而,实施它让我意识到我处理问题的方式
private void StartButton_Click(object sender, RoutedEventArgs e)
{
            // E.G. To change the Fill color of Rectangle4 in StackPanel2
            var rec = FrameworkElementExtensions.TraverseCTFindShape<Shape>(myStackPanel, "myRectangle" + 2 + "-" + 4);
            rec.Fill = new SolidColorBrush(Colors.Red);
}