2

3 つのコントロール ボタンでプロジェクトを作成しました。AddButton はランタイム ボタン コントロールを作成し、canvas1 に追加します。ランタイムで生成されたコントロールを右クリックすると、新しいウィンドウがポップアップします。このウィンドウを保存して、終了したときと同じ状態で再読み込みしたい。私はxmlシリアライゼーションを使用していますが、ロードされますが、そのボタンをクリックしても機能しません。

これが私のコードです:

private void AddButton_Click(object sender, RoutedEventArgs e)
{

                Button b = new Button();
                b.MinHeight = 23;
                b.MinWidth = 73;             
                b.SetValue(Canvas.LeftProperty, e.GetPosition(this).X);
                b.SetValue(Canvas.TopProperty, e.GetPosition(this).Y);
                b.Content = i.ToString();          
                canvas1.Children.Add(b);      
                b.MouseRightButtonUp += new MouseButtonEventHandler(NewButton_Click);

}

 private void NewButton_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;

            ContextMenu pMenu = new ContextMenu();
            MenuItem item1 = new MenuItem();
            item1.Header = "Properties";           
            pMenu.Items.Add(item1);
            btn.ContextMenu = pMenu;
            item1.Click += new RoutedEventHandler(item1_Click);
        }


 private void item1_Click(object sender, EventArgs e)
        {
            MenuItem btn = (MenuItem)sender;
         ControlProp c = new ControlProp();
         c.ShowDialog();  

        }     

  private void Save_Click(object sender, RoutedEventArgs e)
        {
            StringBuilder outstr = new StringBuilder();

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.OmitXmlDeclaration = true;
            settings.NewLineOnAttributes = true;


            XamlDesignerSerializationManager dsm = new XamlDesignerSerializationManager(XmlWriter.Create(outstr, settings));
            dsm.XamlWriterMode = XamlWriterMode.Expression;

            XamlWriter.Save(this.canvas1, dsm);
            string savedControls = outstr.ToString();

            //Show Dialog Box
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "Document"; // Default file name
            dlg.DefaultExt = ".xaml"; // Default file extension
            dlg.Filter = "Xaml documents (.xaml)|*.xaml"; // Filter files by extension

            // Show save file dialog box
            Nullable<bool> result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                string filename = dlg.FileName;
                File.WriteAllText(filename, savedControls);
            }

        }

        private void OpenFile_Click(object sender, RoutedEventArgs e)
        {
            //Open FileDialog
            string filename;
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = "Document"; // Default file name
            dlg.DefaultExt = ".xaml"; // Default file extension
            dlg.Filter = "Xaml documents (.xaml)|*.xaml"; // Filter files by extension

            // Show save file dialog box
            Nullable<bool> result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                 filename = dlg.FileName;

                //Open Xaml
                 StreamReader sR = new StreamReader(filename);
                 string text = sR.ReadToEnd();
                 sR.Close();

                 StringReader stringReader = new StringReader(text);
                 XmlReader xmlReader = XmlReader.Create(stringReader);

                 Canvas wp = (Canvas)System.Windows.Markup.XamlReader.Load(xmlReader);

                 canvas1.Children.Clear(); // clear the existing children

                 foreach (FrameworkElement child in wp.Children) // and for each child in the WrapPanel we just loaded (wp)
                 {
                     canvas1.Children.Add(CloneFrameworkElement(child)); // clone the child and add it to our existing wrap panel
                 }      
            }


        }

        FrameworkElement CloneFrameworkElement(FrameworkElement originalElement)
        {
            string elementString = XamlWriter.Save(originalElement);

            StringReader stringReader = new StringReader(elementString);
            XmlReader xmlReader = XmlReader.Create(stringReader);
            FrameworkElement clonedElement = (FrameworkElement)XamlReader.Load(xmlReader);

            return clonedElement;
        }

つまり、実行時にユーザーが作成したプロジェクトを保存し、mspaint のようにプロジェクトを保存してプロジェクトを開く機能を使用して再度開きたいと考えています。

4

1 に答える 1

1

XamlWriter ( MSDN )を使用できます

于 2012-10-17T07:33:54.747 に答える