外部XAMLファイルの解析中に非常に奇妙な問題が発生しました。事前の歴史は、処理するコンテンツを含む外部XAMLファイルをロードすることです。しかし、私が望むだけ多くのファイルをロードしたい。それは古いものをアンロードして、新しいものをロードすることによって起こります。XamlReader.Load()の異常な動作?
私の問題は次のとおりです。 初めてxamlを読み込むと、すべてがうまくいっています。 しかし、2回目に同じxamlを読み込むと、オブジェクトim Loadingのすべてのエントリが2回あります。私がこれをもう一度実行すると、すべてのオブジェクトがそこに3回あります。
プロジェクトを自分でデバッグするには、hereをダウンロードしてください。この関数は、ファイル "Control Panel.xaml.cs"の137行目から開始します。私は本当にこれが何であるか分からない。それは私のせいかバグですか?はいの場合、回避策はありますか?
/// <summary>
/// Load a xaml file and parse it
/// </summary>
public void LoadPresentation()
{
this.Title = "Control Panel - " + System.IO.Path.GetFileName(global.file);
System.IO.FileStream XAML_file = new System.IO.FileStream(global.file, System.IO.FileMode.Open);
try
{
System.IO.StreamReader reader = new System.IO.StreamReader(XAML_file);
string dump = reader.ReadToEnd(); //This is only for debugging purposes because of the strange issue...
XAML_file.Seek(0, System.IO.SeekOrigin.Begin);
presentation = (ResourceDictionary)XamlReader.Load(XAML_file);
//Keys the resourceDictionary must have to be valid
if (presentation["INDEX"] == null || presentation["MAIN_GRID"] == null || presentation["CONTAINER"] == null || presentation["LAYOUTLIST"] == null)
{
throw new Exception();
}
//When this list is loaded, every item in it is there twice or three times or four... Why????
TopicList Index = null;
Index = (TopicList)presentation["INDEX"];
for (int i = 0; i < topics.Count;)
{
topics.RemoveAt(i);
}
foreach (TopicListItem item in Index.Topics)
{
topics.Insert(item.TopicIndex, (Topic)presentation[item.ResourceKey]);
}
lv_topics.SelectedIndex = 0;
selectedIndex = 0;
}
catch
{
System.Windows.Forms.MessageBox.Show("Failed to load XAML file \"" + global.file + "\"", "Parsing Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
presentation = null;
}
finally
{
XAML_file.Close();
}
}
編集:私はどこにもXamlReaderからの出力に任意のchildelementをして読まれなかったオブジェクトをシリアル化しようとしてい
...しかし、私は辞書のうち、対象物を引く場合は、子どもたちすべてがそこにあります(重複して3倍ですが、そこにあります)。私はすでにコードポストのトピックで
topics.Clear();
と
topics=new ObservableCollection<TopicListItem>();
lv_topics.ItemsSource=topics;
はい、それは、ありがとう、それを解決しました。しかし、なぜ?私はそれらのオブジェクトが一緒にリンクされている理由を理解していません... – CShark
あなたに答えるために、私はなぜわかりません。私はあなたのコードを約1時間演奏して、自分が何をしたのかを判断しました。私はトピックの正しい数を持っていたXamlReader.Loadを削除しました。プレゼンテーションをTopicListにキャストするとすぐに余分なトピックが表示されていました。私はそれがあなたのTopicListタイプの静的宣言と関係があると推測しています。それをヌルに設定してから再割り当てすると、古いデータとバックアップを接続することができます。 –
静的なDependencyPropertyは、バインディングを処理する通常の方法ではありませんか?もしそうなら、最初に表示されるはずのトピックがありますか?私はこのバグを他のいくつかの人々に示しました。彼らの最終的な意見は、.NET Frameworkにバグがあることです。私はこれを再現し、より多くの情報を収集しようとします... – CShark