1

WPFウィンドウでCanvasを使用してUserControlを表示しています。同じUserControlをCanvasに追加したくありません。

どうやってやるの?

現在私がやった。

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);
            }
        }
    }
}

このようなUserControlを追加します

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

それは私のために働きますが、私が他のコントロールを追加すると

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

と呼ばれる例外をスローします

コレクションが変更されたため、列挙子は無効です。

4

2 に答える 2

2

エラーは、( 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);
}
于 2012-04-24T22:12:59.417 に答える
0

またはもっと簡単に

if (JIMSCanvas.Children.Any(c => c.Uid == ctrl.Uid)
{
   MessageBox.Show("Already"); 
}
else
{
   JIMSCanvas.Children.Add(ctrl); 
}
于 2012-04-25T10:25:41.023 に答える