【问题标题】:WPF/AvalonDock v2.0 LayoutDocumentWPF/AvalonDock v2.0 布局文档
【发布时间】:2012-09-19 10:43:36
【问题描述】:

如何以编程方式添加包含一些 UIElement 的 LayoutDocument? (如 stackpanel、scrollviewer 等)当用户单击“新建项目”按钮时,我想将带有 stackpanel、canvas 等的新 LayoutDocument 添加到 LayoutDocumentPane。我可以以某种方式从一个 LayoutDocument 克隆 xaml 代码并将其加载到新的吗?是否可以将 Title LayoutDocument 属性绑定到 ViewModel 属性? (我得到错误它必须是依赖属性)

【问题讨论】:

    标签: wpf avalondock


    【解决方案1】:

    您可以使用Content 属性。例如,如果您想添加一个带有自定义内容的新 LayoutDocument(例如StackPanel),您可以按如下方式进行:

    //Get the main LayoutDocumentPane of your DockingManager 
    var documentPane = dockManager.Layout.Descendents().OfType<LayoutDocumentPane>().FirstOrDefault();
    
    if (documentPane != null)
    {
        LayoutDocument layoutDocument = new LayoutDocument {Title = "New Document"};
    
        //*********Here you could add whatever you want***********
        layoutDocument.Content = new StackPanel();
    
        //Add the new LayoutDocument to the existing array
        documentPane.Children.Add(layoutDocument);
    }
    

    【讨论】:

      【解决方案2】:

      首先,在 XAML 中 - 为 Grid 命名,例如 x:Name = "mainGrid"

      然后在课堂上写这个

              //Create button - we put this in document
              Button mybutton = new Button();
              mybutton.Content = "hello";
              mybutton.Width = 100;
              mybutton.Height = 50;
              mybutton.Click += (sender, ev) => { MessageBox.Show("Hello"); };
      
      
              DockingManager dockmanager = new DockingManager();
      
              //Set theme
              dockmanager.Theme = new Xceed.Wpf.AvalonDock.Themes.ExpressionLightTheme();
      
              //Create LayoutRoot
              var layoutroot = new Xceed.Wpf.AvalonDock.Layout.LayoutRoot();
      
              //Create LayoutPanel
              var layoutpanel = new Xceed.Wpf.AvalonDock.Layout.LayoutPanel();
      
              //Create LayoutDocumentPane
              var layoutdocpane = new Xceed.Wpf.AvalonDock.Layout.LayoutDocumentPane();
      
              //Create LayoutDocument and set parameters of Document
              var LayoutDocument = new Xceed.Wpf.AvalonDock.Layout.LayoutDocument();
              LayoutDocument.Title = "Some text";
              //Put button in Document
              LayoutDocument.Content = mybutton;
      
              layoutdocpane.Children.Add(LayoutDocument);
              layoutpanel.Children.Add(layoutdocpane);
              layoutroot.RootPanel.Children.Add(layoutpanel);
      
              dockmanager.Layout = layoutroot;
              mainGrid.Children.Add(dockmanager);
      

      对不起,我的英语很差。如果有帮助,请重写。

      【讨论】:

      • +1 终于找到了一些代码,展示了如何使用 AvalonDock 以编程方式自下而上地做所有事情
      • 哦。大声笑,对不起,我的误解:)
      【解决方案3】:

      我不太熟悉 WPF,尤其是 AvalonDock。我这样做了,到目前为止它有效:)

      您可以为从 LayoutDocument 继承的文档编写一个单独的类。通过这种方式,您应该能够使用 VisualStudio 设计器编辑“项目文档”的标准布局(添加您的堆栈面板、画布等)。

      (我假设您有一种显示“项目文档”的标准方式。否则,您可以像在 WPF 中那样在代码中自己构建内容并将其放入 LayoutDocument 中。)

      例如:

      <ad:LayoutDocument x:Class="Namespace.MyDocument"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
          xmlns:ad="http://avalondock.codeplex.com"
          d:DesignHeight="500"
          d:DesignWidth="800"
      
      <Grid>
          <!-- content -->
      </Grid>
      
      </ad:LayoutDocument>
      


      而后面代码中的类继承自LayoutDocument:

      namespace Namespace
      {
          public partial class MyDocument : AvalonDock.Layout.LayoutDocument
          {
              // ...
          }
      }
      



      要创建和添加新文档,您只需实例化一个新的 MyDocument 对象并通过绑定或layoutDocumentPane.Children.Add(doc) 之类的方式将其添加到集合中。


      不过,我不知道 Title 属性的绑定。

      【讨论】:

      • 谢谢,但我已经使用 实现了这一点,该类继承自 Ad:DockingManager 中的 DataTemplateSelector 和 DocumentSource={Binding Documents},它绑定到我的 Document ViewModel。您还可以使用 轻松绑定到 Title 属性,只需将 Style.Setter Property="Title" 设置为 ViewModel 中的值。
      【解决方案4】:

      完全正确。 只需添加doc.Title = "My document title"即可添加标题

      您可以在document.xaml 中添加Title="My document title",这将是孩子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 2011-02-27
        • 1970-01-01
        相关资源
        最近更新 更多