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 のようにプロジェクトを保存してプロジェクトを開く機能を使用して再度開きたいと考えています。