1

メインページのグリッドに、コードビハインドで追加されたWebブラウザアイテムを入力しようとしています。何らかの理由で、どの要素がすでに追加されているかをグリッドに記憶させることができません。MainPageに移動した後、戻ったときに、グリッドが以前に追加された値を認識できるように、この情報を保存する方法がわかりません。よりよく説明するために、私が持っているものは次のとおりです。

MainPage.xaml

<Grid x:Name="BrowserHost" Grid.Row="1">
    //Items will be added in code behind
</Grid>

MainPage.xaml.cs

private void ShowTab(int index) 
    {
        this.currentIndex = index;
        int count = Settings.BrowserList.Value.Count;

        if (count <= 0)
        {                
            MessageBox.Show("count <= 0");
        }
        if (currentIndex <= (count - 1))  //in correct range
        {
            // BrowserHost does not remember previously added children elements added previously when navigated back to this page and performing this check
            if(!BrowserHost.Children.Contains(Settings.BrowserList.Value[currentIndex].Browser))
                //Attempt to add browser if it was already added previously throws InvalidOperationException
                BrowserHost.Children.Add(Settings.BrowserList.Value[currentIndex].Browser);
        }

        if (currentIndex > (count - 1))
        {
            MessageBox.Show("currentIndex > (count - 1)");
        }

        for (int i = 0; i < Settings.BrowserList.Value.Count; i++)
        {
            if (Settings.BrowserList.Value.ElementAt(i) != null)
            {
                Settings.BrowserList.Value.ElementAt(i).Browser.Visibility = i == this.currentIndex ? Visibility.Visible : Visibility.Collapsed;
            }
        }
    }

基本的に、このShowTabメソッドは、MainPageがロードされるたびに特定のインデックス値で呼び出されます。リストのcurrentIndexに(Webブラウザーインスタンスを含むコレクション)が存在するかどうかを確認するためのチェックが実行されますSettings.BrowserList.Value[currentIndex].Browser(これらは別のページに追加されます)。MainPageのBrowserHostグリッドに特定のインデックスを持つ子要素(ブラウザ)がすでに含まれている場合は、チェックをスキップして、そのブラウザインスタンスを画面に表示し続ける必要があります。これは基本的に、私が作成したカスタムWebブラウザーコントロールのタブブラウジングシナリオを実装することになっています。私の問題は、新しいブラウザを連続して追加できることですBrowserHost画面に表示しますが、コレクション内の特定のインデックスで以前に追加したWebブラウザーを呼び出そうとすると、InvalidOperationExceptionが発生します。これをどのように修正しますか?私のデバッグではShowTab、ブラウザが追加されているかどうかを確認すると、追加されているかどうかに関係なく、そのブラウザをBrowserHost子要素に追加しようとするとジャンプすることが示されています。ブラウザが以前に作成されている場合は、InvalidOperationExceptionが発生します。

4

1 に答える 1

0

あなたがしていることは良い考えではないと思います。ただし、問題は、コントロールがすでに別のコントロールによって親になっているため、再度追加できないことであると思われます。次のことを試してください。

var browser = Settings.BrowserList.Value[currentIndex].Browser;
if(!BrowserHost.Children.Contains(browser))
{

  var grid = (Grid)browser.Parent;
  if (grid != null)
  {
    grid.Children.Remove(browser);
  }
  BrowserHost.Children.Add(browser);
}

また、ブラウザが他の形式のグリッドに配置されていることを確認する必要があります(グリッド内に直接ない場合は、1つにラップするだけです)。

これはうまくいくかもしれませんが、別の方法を見つけることを強くお勧めします。

于 2012-09-24T22:23:13.567 に答える