在基于文本框输入的堆栈面板中添加图像

本文关键字:堆栈 图像 添加 输入 于文本 文本 | 更新日期: 2023-09-27 18:05:19

我试图在stackpanel中添加存储在..'Resources'ebi.png中的图像。大多数时候,相同的图像将显示在Stackpanel中,取决于文本框输入"EtReqCount"。下面是试过的示例代码,但是出现

错误

"指定的可视化对象已经是另一个可视化对象的子对象或者是CompositionTarget的根对象"

下面是尝试的代码:

    private BitmapImage bmp = new BitmapImage(new Uri("WpfApplication1;component/Resources/ebi.png", UriKind.RelativeOrAbsolute));
    private void EtReqCount_TextChanged(object sender, TextChangedEventArgs e)
    {
        StackPanel dynamicStackPanel = new StackPanel();
        dynamicStackPanel.Width = 300;
        dynamicStackPanel.Height = 200;
        dynamicStackPanel.Background = new SolidColorBrush(Colors.LightBlue);
        dynamicStackPanel.Orientation = Orientation.Vertical;
        if (EtReqCount.Text != "")
        {
            for (int k = 1; k <= Int32.Parse(EtReqCount.Text); k++)
            {
                Image img = new System.Windows.Controls.Image(); // This makes the difference.
                img.Source = bmp;
                dynamicStackPanel.Children.Add(img);
            }
        }
    }
XAML Code:

在基于文本框输入的堆栈面板中添加图像

很明显。相同的图像已经是StackPanel的子元素,你不能一次又一次地添加它。

此外,您应该使用私有成员来保存重复使用的bmp,以节省资源:

在class.cs之外和class.cs内部:

private BitmapImage bmp=new BitmapImage(new Uri("/....../ebi.png", UriKind.RelativeOrAbsolute);

您可以创建图像的新实例:

for(int i=0; i<...;i++)
{
    img = new System.Windows.Controls.Image();  // This makes the difference.
    img.Source = bmp;
    dynamicStackPanel.Children.Add(img);
}