避免在 WPF 的画布中添加相同的用户控件

本文关键字:用户 控件 添加 WPF 布中 | 更新日期: 2023-09-27 18:32:05

我在WPF窗口中使用画布来显示UserControl。我不想在画布中添加相同的用户控件。

我该怎么做?

目前我已经做了..

private void OpenChild(UserControl ctrl)
{            
    ctrl.Uid = ctrl.Name;
    if (JIMSCanvas.Children.Count == 0)
    {                
        JIMSCanvas.Children.Add(ctrl);
    }
    else
    {
        foreach (UIElement child in JIMSCanvas.Children)
        {
            if (child.Uid == ctrl.Uid)
            {
                MessageBox.Show("Already");
            }
            else
            {
                JIMSCanvas.Children.Add(ctrl);
            }
        }
    }
}

并添加如下所示的用户控件

OpenChild(new JIMS.View.Ledger());

它对我有用,但是当我添加其他控件时,例如

OpenChild(new JIMS.View.Stock());

它抛出一个异常,称为

枚举器无效,因为集合已更改。

避免在 WPF 的画布中添加相同的用户控件

该错误是由于您在循环过程中修改枚举(在 foreach 内)的事实。 只需使用不更改枚举的方法:

bool alreadyExists = false;
UIElement existingElement = null;
foreach (UIElement child in JIMSCanvas.Children)
{
    if (child.Uid == ctrl.Uid)
    {
        alreadyExists = true;
        existingElement = child;
    }
}
if (alreadyExists)
{
    MessageBox.Show("Already");
    existingElement.Visibility = System.Windows.Visibility.Visible;
}
else
{
    JIMSCanvas.Children.Add(ctrl);
}

或者更简单

if (JIMSCanvas.Children.Any(c => c.Uid == ctrl.Uid)
{
   MessageBox.Show("Already"); 
}
else
{
   JIMSCanvas.Children.Add(ctrl); 
}