Avalondock MVVM 布局

2023-12-07

所以这个问题之前已经被问过但没有得到答复 or 没有按照我想要的方式回答

我知道如何创建我想要实现的布局,使用LayoutAnchorablePaneGroup, LayoutAnchorablePane and LayoutDocument在 XAML 中,但我想以 MVVM 方式使用 Avalondock,将我的 XAML 简化为:

<avalonDock:DockingManager x:Name="dockingManager" 
                                       DataContext="{Binding DockManagerViewModel}"
                                       DocumentsSource="{Binding Documents}"
                                       AnchorablesSource="{Binding Anchorables}"
                                       Loaded="dockingManager_Loaded" 
                                       Unloaded="dockingManager_Unloaded">

填充Documents and Anchorables使所需的窗口出现在停靠管理器中,但我不知道如何指定它们出现的位置。

如何指定一些规则(最好在 XAML 中)来构建特定的布局,而不失去 MVVM 分离?

例如:类型 A 的对象应该全部放在一个LayoutAnchorablePane在右侧,类型 B 的对象全部放在 a 中LayoutAnchorablePane在左边等等。

提前致谢。


我也遇到了同样的情况。并找到了一个很棘手但对我有用的解决方案。

遵循了代码项目解决方案并实现了保存和加载布局。

请注意,应用程序第一次启动时没有布局,因此您需要使用所需的布局创建 XML,稍后您可以加载保存的布局。希望这可以帮助。

对接管理器示例:

  <xcad:DockingManager x:Name="DockingManagerDockView"
                         AnchorablesSource="{Binding AnchorableSource}" 
                         DocumentsSource="{Binding DocumentSource}" 
                         Utility:AvalonDockLayoutSerializer.SaveLayoutCommand="{Binding SaveLayoutCommandOnExit}"
                         Utility:AvalonDockLayoutSerializer.LoadLayoutCommand="{Binding LoadLayoutCommand}">       
    <xcad:DockingManager.Theme>
        <xcad:MetroTheme />
    </xcad:DockingManager.Theme>
    <xcad:DockingManager.LayoutUpdateStrategy>
        <Pane:LayoutInitializer/>
    </xcad:DockingManager.LayoutUpdateStrategy>
    <xcad:DockingManager.Resources>            
        <DataTemplate DataType="{x:Type ViewModels:ExplorerViewModel}">
            <Views:ExplorerView />
        </DataTemplate>            
        <DataTemplate DataType="{x:Type ViewModels:TableOfContentViewModel}">
            <Views:TableOfContentView x:Name="TOCView" Focusable="True">
                <Views:TableOfContentView.InputBindings>
                    <KeyBinding Key="F5" Command="{Binding GridF5Command}"/>
                </Views:TableOfContentView.InputBindings>
            </Views:TableOfContentView>
        </DataTemplate>
        <DataTemplate DataType="{x:Type ViewModels:PropertyViewModel}">
            <Views:PropertyView />
        </DataTemplate>           
        <DataTemplate DataType="{x:Type ViewModels:SearchViewModel}">
            <Views:SearchPanel />
        </DataTemplate>
        <DataTemplate DataType="{x:Type ViewModels:DocumentViewModel}">
            <Views:DocumentView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type ViewModels:ReIndexPanelViewModel}">
            <Views:ReIndexPanel />
        </DataTemplate>
    </xcad:DockingManager.Resources>       
    <xcad:DockingManager.LayoutItemContainerStyleSelector>
        <Pane:PanesStyleSelector>
            <Pane:PanesStyleSelector.ToolStyle>
                <Style TargetType="{x:Type xcad:LayoutAnchorableItem}">
                    <Setter Property="Title" Value="{Binding Model.Title}"/>
                    <Setter Property="Visibility" Value="{Binding Model.IsVisible, Mode=TwoWay, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter={x:Static Visibility.Hidden}}"/>
                    <Setter Property="ContentId" Value="{Binding Model.ContentId}"/>
                    <Setter Property="FlowDirection" Value="LeftToRight"/>
                    <Setter Property="UseLayoutRounding" Value="False"/>
                    <Setter Property="IconSource" Value="{Binding Model.IconSource}"/>
                </Style>
            </Pane:PanesStyleSelector.ToolStyle>
            <Pane:PanesStyleSelector.FileStyle>
                <Style TargetType="{x:Type xcad:LayoutItem}">
                    <Setter Property="Title" Value="{Binding Model.Title}"/>
                    <Setter Property="ToolTip" Value="{Binding Model.FilePath}"/>
                    <Setter Property="ContentId" Value="{Binding Model.ContentId}"/>
                    <Setter Property="CanClose" Value="False"/>                        
                </Style>
            </Pane:PanesStyleSelector.FileStyle>
        </Pane:PanesStyleSelector>
    </xcad:DockingManager.LayoutItemContainerStyleSelector>
    <xcad:LayoutRoot>
        <xcad:LayoutPanel Orientation="Horizontal">                
                <xcad:LayoutAnchorablePaneGroup>
                    <xcad:LayoutAnchorablePane Name="Explorer" DockMinWidth="250"/> 
                    <xcad:LayoutAnchorablePane Name="TOC" DockMinWidth="500"/>
                    <xcad:LayoutAnchorablePane Name="Property" DockMinWidth="300" />
                    <xcad:LayoutAnchorablePane Name="Search" DockMinWidth="300" />
                    <xcad:LayoutAnchorablePane Name="ReIndex" DockMinHeight="300" />
                </xcad:LayoutAnchorablePaneGroup>
            <xcad:LayoutDocumentPaneGroup >
                <xcad:LayoutDocumentPane/>
            </xcad:LayoutDocumentPaneGroup>
        </xcad:LayoutPanel>            
    </xcad:LayoutRoot>
</xcad:DockingManager>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Avalondock MVVM 布局 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是

随机推荐

  • 如何在 UIImage 上快速绘制/涂鸦线?

    我需要在 UIImage 中绘制 涂鸦一条线 如上图所示 我看到很多教程在 UIView 上涂鸦线 但不在 UIImage 中 用户在图像上涂鸦后 我想将其保存为新图像 有线条的图像 我该如何在 Swift 中做到这一点 我只能在 UIVi
  • Python 用多个分隔符分割字符串并查找使用的分隔符

    如何使用多个分隔符分割字符串 并找出使用哪个分隔符分割 maxsplit 为 1 的字符串 import re string someText someValue re split string 1 returns someText som
  • 运行时错误 - 无法访问文件

    我有以下 VBA 脚本 它可以保存工作簿 并且效果很好 但是 如果再次单击 commandbutton1 它会正确显示选项框 您要替换该文件吗 是 否 取消 是 选项工作正常 但 否 和 取消 选项会弹出错误框 RunTime error
  • Matlab全局变量可以在Matlab中产生更好的性能吗?

    我讨厌使用全局变量 每个人都应该这样做 如果一种语言无法使用全局变量 则应该对其进行更新 目前 当效率是目标时 我不知道在 Matlab 中使用全局变量有什么好的替代方法 据我所知 只能通过 4 种方式在回调之间共享数据 嵌套函数 geta
  • Flexbox 列换行列表,无重叠项目

    我有一个列表 我想将其包装在最大宽度为 540px 的弹出模式上显示 通常 它看起来像这样 但如果添加太多名字 那么它就会像这样重叠 我的目标是通过隐藏溢出 仅显示基于数据的最大可能列 或使其可滚动来防止名称重叠 当项目数量和名称长度未知时
  • 使用 Flexbox 控制行中的项目数

    我想在第一行显示 4 个项目 但在第二行只显示 3 个项目 然后在第三行显示 4 个项目 在第四行显示 3 个项目 依此类推 我已经通过以下方式实现了这一点nth child但代码太多 不灵活 可扩展性差 可以用flex吗 还是网格 box
  • PHPExcel - 未正确获取引用另一个单元格的单元格值

    当我尝试从 Excel 文件中提取信息时遇到这个问题 这是我的情况 我有 34 个 Excel 文件 这些文件是我从各个用户那里收到的 我正在使用 PHP 版本 5 从 Excel 文件中提取 我的脚本将为每个文件循环 并根据工作表名称再次
  • Primefaces tabview tabChange 事件在显示选项卡后触发

    我正在使用 Primefaces 3 5 和 JSF2 1 Mojarra 开发一个项目 我创建了一个primefaces
  • matlab使用activex接口自动保存excel文件

    我有一个matlab代码 运行程序后 创建了一个文件 example2 xlsx 现在我有下面的代码 我希望 matlab 将当前的 example2 xlsx 替换为新的 example2 xlsx 自动保存而不询问我是否要替换它 e a
  • 在 iPhone 中实现静态库

    我创建了一个静态库如下这个链接 但我在使用图书馆时遇到问题 有关如何在 iPhone 项目中使用静态库的参考 我遵循这个链接 但我仍在为 如何在任何其他 iPhone 项目中实现静态库 而苦苦挣扎 问题 谢谢你们 您可以像帖子中那样使用跨项
  • 如何使用Python打印多行文本

    如果我想在Python中打印多行文本而不需要输入print 对于每一行 有没有办法做到这一点 我在 Python 3 5 1 中将其用于 ASCII 艺术 您可以使用triple引号 单 或双 a text text text print
  • Java 唯一随机生成整数的数组

    public static int uniqueRandomElements int size int a new int size for int i 0 i lt size i a i int Math random 10 for in
  • Angular2:将服务器端配置注入服务

    我在 ASP NET Core 中使用 Angular 2 0 0 和 TypeScript 我的目标是根据服务器端变量在我的应用程序中创建 AppConfig 服务 在其他几个答案的帮助下 我能够创建以下代码 索引 cshtml
  • 如何使用jquery获取输入类型?

    我有一个页面 输入类型总是变化 我需要根据输入类型获取值 因此 如果类型是收音机 我需要知道哪个被选中 如果它是一个复选框 我现在需要检查哪个 如果它是一个下拉菜单 我需要知道哪个被选中 如果是 我需要知道我需要知道文本 文本区域的值 关于
  • Java注解无法从上层类访问受保护的静态字段

    该代码有效吗 public abstract class A protected static final String c my const myAnnotation value A c public class B extends A
  • SyndicateFeed:内容为 CDATA?

    我正在使用 NET 的 SyndicateFeed 来创建 RSS 和 ATOM 提要 不幸的是 我需要在描述元素 SyndicateItem 的 Content 属性 中包含 HTML 内容 并且格式化程序会自动对 HTML 进行编码 但
  • PHP 重命名包含 utf-8 阿拉伯字符集字符串的文件名失败

    我的 php 重命名功能有问题 如果文件名是带空格的阿拉伯单词 它会失败 e g rename temp mp3 audio 13408831061 mp3 路径 中没有这样的文件或目录 请注意 xxxxxxxx mp3 xxxxxxx这里
  • JQuery .Show() 不适用于服务器控制?

    我有 2 个 html TR 是我制作的runat server visible false 我有一个名为的下拉列表citiesDropDownList document ready function change function Val
  • 使用 QDataStream 将 QImage 转换为 QByteArray

    我试图将由 ScreenShot 制作的 QImage 转换为 QByteArray 以通过 QTCPSocket 发送 当我将 QImage 转换为 QByteArray 并在发送之前我尝试反序列化并将其显示在标签上 但它不能 我有什么错
  • Avalondock MVVM 布局

    所以这个问题之前已经被问过但没有得到答复 or 没有按照我想要的方式回答 我知道如何创建我想要实现的布局 使用LayoutAnchorablePaneGroup LayoutAnchorablePane and LayoutDocument