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