WPF - AvalonDock - 关闭文档

2024-01-31

我在 WPF 项目中将 AvalonDock 与 MVVM 结合使用。

当我点击“X”(选项卡的关闭按钮)时,我的文档将关闭但保留在内存中。看来只是隐藏而已。它没有从我的中删除Model.Documents收藏。

如果我添加DockingManager_DocumentClosing并尝试从集合中删除我的文档,我在以下方法中收到异常Xceed.Wpf.AvalonDock.Layout.LayoutContent因为parentAsContainer一片空白。

/// <summary>
/// Close the content
/// </summary>
/// <remarks>Please note that usually the anchorable is only hidden (not closed). By default when user click the X button it only hides the content.</remarks>
public void Close()
{
    var root = Root;
    var parentAsContainer = Parent as ILayoutContainer;
    parentAsContainer.RemoveChild(this);
    if (root != null)
        root.CollectGarbage();
    OnClosed();
}

有谁知道我如何管理 AvalonDock 中可以从我的文件中删除的文档Model.Documents以便当我击中它时最终被处置Close button?

供参考:这是我的 AvalonDock 的 XAML:

<avalonDock:DockingManager
    x:Name="DockingManager" 
    DocumentsSource="{Binding DocumentItems}"  
    ActiveContent="{Binding ActiveMainWindowViewModel,
        Converter={StaticResource RestrictedClassConverter},
        ConverterParameter={x:Type multiSimAnalysis:MainWindowViewModel},
        Mode=TwoWay}"
    DocumentClosing="DockingManager_DocumentClosing"
    ActiveContentChanged="DockingManager_ActiveContentChanged">

  <avalonDock:DockingManager.LayoutItemContainerStyleSelector>
    <pane:PanesStyleSelector>
      <pane:PanesStyleSelector.MainWindowViewLcStyle>
        <Style TargetType="{x:Type avalonDock:LayoutItem}">
          <Setter Property="Title" Value="{Binding Model.Title}"/>
          <Setter Property="ToolTip" Value="{Binding Model.Title}"/>
          <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}"/>
          <Setter Property="IconSource" Value="{Binding Model.IconSource}"/>
          <Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}"/>
          <Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/>
          <Setter Property="ContentId" Value="{Binding Model.ContentId}"/>
        </Style>
      </pane:PanesStyleSelector.MainWindowViewLcStyle>
    </pane:PanesStyleSelector>
  </avalonDock:DockingManager.LayoutItemContainerStyleSelector>

  <avalonDock:DockingManager.LayoutItemTemplateSelector>
    <multiSimAnalysis:PanesTemplateSelector>
      <multiSimAnalysis:PanesTemplateSelector.MainWindowLcTemplate>
        <DataTemplate>
          <multiSimAnalysis:MainWindowViewLc /> 
        </DataTemplate>
      </multiSimAnalysis:PanesTemplateSelector.MainWindowLcTemplate>
    </multiSimAnalysis:PanesTemplateSelector>
  </avalonDock:DockingManager.LayoutItemTemplateSelector>

  <avalonDock:DockingManager.Theme>
    <avalonDock:VS2010Theme/>
  </avalonDock:DockingManager.Theme>
  <avalonDock:LayoutRoot>
    <avalonDock:LayoutPanel Orientation="Horizontal">
      <avalonDock:LayoutAnchorablePane DockWidth="400">
        <avalonDock:LayoutAnchorable Title="Scope(s) selection" x:Name="PanelScopeSelection" IsVisible="True">
          <scopeSelection:UserControlSelectStudyScope x:Name="ToolScopeSelection"/>
        </avalonDock:LayoutAnchorable>
      </avalonDock:LayoutAnchorablePane>
      <avalonDock:LayoutDocumentPane/>
      <avalonDock:LayoutAnchorablePane DockWidth="150">
        <avalonDock:LayoutAnchorable Title="Properties" x:Name="PanelScopePropertyGrid">
          <!--<multiSimAnalysis:UserControlPropertyGrid x:Name="ToolPropertyGrid"  />-->
          <xctk:PropertyGrid x:Name="ToolPropertyGrid" SelectedObject="{Binding ActiveObject}" />
        </avalonDock:LayoutAnchorable>
      </avalonDock:LayoutAnchorablePane>
    </avalonDock:LayoutPanel>
  </avalonDock:LayoutRoot>
</avalonDock:DockingManager>

我实际上找到了一个不可接受的解决方法。 实在是太扭曲了。

我只给这个作为参考。应该有一个干净的方法来做到这一点。

    // ************************************************************************
    private void DockingManager_DocumentClosing(object sender, Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e)
    {
        e.Document.CanClose = false;

        DocumentModel documentModel = e.Document.Content as DocumentModel;
        if (documentModel != null)
        {
            Dispatcher.BeginInvoke(new Action(() => this.Model.DocumentItems.Remove(documentModel)), DispatcherPriority.Background);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF - AvalonDock - 关闭文档 的相关文章

  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 为什么以 margin 0 auto 居中可以与 display:block 一起使用,但不能与 display:inline-block 一起使用?

    只是一个困扰我的问题 为什么以 margin 0 auto 确实可以很好地工作 display block 但当显示设置为时 div 不会居中 display inline block 感谢您的解答 我的理解如下 尽管我很高兴被纠正 内联元
  • C++ Windows 中的 RAW 套接字

    我想用一个RAW Socket在 Visual C 中 我看到了一个函数Linux这是 int out socket AF INET SOCK RAW htons ETH P ALL 使用此代码linux我们可以做到这一点 但是如何在 Wi
  • C 中结构体和数组哪个更快?

    我想实现 抽象地表示 一个二维 4x4 矩阵 我为矩阵乘法等编写的所有代码都将完全 展开 也就是说 我不会使用循环来访问和写入矩阵中的数据条目 我的问题是 在 C 中 使用这样的结构会更快吗 typedef struct double e0
  • 如何正确处理 LinqToSql 类的 System.Nullable 字段?

    我有一个带有一些可为空双字段的表 使用 LinqToSQL 尝试直接使用该字段我得到 参数类型 System Nullable 不可分配给参数类型 double 我该如何正确处理这个问题 该问题与 Linq 无关 这与之间的转换有关doub
  • React Native ScrollView/FlatList 不滚动

    我有一个数据列表 我想将其放入 FlatList 即 ScrollView 中 每当我尝试向下滚动以查看列表的更多内容时 ScrollView 就会弹回到列表顶部 因此我永远看不到列表底部 我正在使用 Expo 奇怪的是 如果我只是创建一个
  • 搜索/过滤状态 NGXS

    我是 NGXS 的新手 并尝试将其集成到一个小项目中 唯一的问题是没有关于状态搜索 过滤的好例子 我的应用程序从后端 API 获取产品列表 它在页面上按 SKU 显示它们 我希望用户能够在输入字段中输入 SKU 并让列表在用户输入时自动筛选
  • 从 BroadcastReceiver 调用时 startActivity 不起作用

    我有一个通知 当我选择时 它会发送一个Broadcast to a BroadcastReceiver用一个PendingIntent 在里面onReceive我开始一个新的Activity 但是 如果我从最近打开的应用程序中删除我的应用程
  • Fortran 数字格式

    我正在使用英特尔 Visual Fortran 编译器专业版 11 1 当我运行此代码时 program Console1 implicit none real 8 parameter iterations 1000 d0 real 8 p
  • 如何通过 zRotation 约束阻止我的角色过度旋转?

    我正在开发一款平台游戏中的车辆 我希望能够允许旋转 以便它可以滚上山等 我想将车辆的正负方向旋转限制为 30 度 问题是 当我启用旋转并从悬崖上滚下或直边掉落时 我的车辆会从侧面翻转并以头部着地 我一直在寻找一种方法将 zRotation
  • 为什么在 Spring Data JPA Repository 上使用 save() 之后返回的实例?

    这是代码 Repository public interface AccountRepository extends JpaRepository
  • Flex 3 中的 XML 和 XMLList 以及 XMLListCollection

    请解释一下 XML 与 XMLList 和 XMLListCollection 之间的区别 如果可能的话 用简单的话举例说明 提前致谢 首先 链接到 Flex 3 语言参考 查找这些内容必须有的书签 http help adobe com
  • Django Haystack ElasticSearch 上“未找到结果”

    Failed to query Elasticsearch using TransportError 400 u parsing exception u no query registered for filtered Traceback
  • Liquibase 3.0.1 Gradle 集成

    我们使用 liquibase 进行数据库版本控制 使用 gradle 作为构建工具 目前我们使用 liquibase in version 2 0 5 com augusttechgroup gradle liquibase plugin
  • 使用 google apps 脚本保护范围

    我有很多纸张需要保护 但某些范围除外 是否可以使用脚本来执行此操作 因为我有几张工作表 并且工作表中的许多范围需要不受保护 以便工作人员可以编辑工作表 我需要不受保护的范围是重复的 所以我希望它是可行的 我将在我给您的示例表上用黄色填充我想
  • site_url() 和 base_url() 有什么区别?

    正如我读过的一些资源 base url and site url 功能于Codeigniter几乎相同 尽管我的 Codeigniter 版本 2 1 3 在其 config php 文件 在 config 目录中 中没有 site url
  • 如何在 Mac 上的 webkit 中消除 html5 搜索输入中的水平填充或缩进?

    仅在 Mac 上的 webkit 中 搜索输入中的文本从左侧缩进 这是一个演示 http oscorp net experiments search input 即使在剥离所有填充 文本缩进和设置之后 webkit appearance t
  • gem5 系统调用模拟 OpenBLAS cblas_dgemm 失败并显示“致命:系统调用 mbind (#237) 未实现”

    我正在开发一个程序 我需要在 SE 模式下模拟使用 gem5 调用 OpenBLAS 函数的程序 我的代码 C语言 如下 include
  • 循环记录的列

    我需要循环类型RECORD按键 索引排列的项目 就像我可以使用其他编程语言中的数组结构来做到这一点 例如 DECLARE data1 record data2 text BEGIN FOR data1 IN SELECT FROM some
  • 数据库设计-具有属性的多类别产品

    我正在为供应商设计一个基本的库存系统 他们有许多不同的产品类别 每个产品类别都有许多不同的属性 A x1 x2 x3 a1 a2 a3 B x1 x2 x3 b1 b2 b3 b4 C x1 x2 x3 c1 c2 Laptop Make
  • WPF - AvalonDock - 关闭文档

    我在 WPF 项目中将 AvalonDock 与 MVVM 结合使用 当我点击 X 选项卡的关闭按钮 时 我的文档将关闭但保留在内存中 看来只是隐藏而已 它没有从我的中删除Model Documents收藏 如果我添加DockingMana