是否有关于将AvalonDock与Caliburn Micro MVVM一起使用的博客或文章?谷歌搜索时找不到多少
http://avalondock.codeplex.com/
编辑:得到了投票,所以为什么不用最终解决方案更新.完整代码可以在这里找到
https://github.com/AndersMalmgren/FreePIE
大多数与avalon相关的代码都可以在这里找到
https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Shells/MainShellView.xaml
Sam回答后更新
为了使Caliburn成功,需要做的非常非常少.首先实现一个LayoutItemTemplateSelector
public class AutobinderTemplateSelector : DataTemplateSelector
{
public DataTemplate Template { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return Template;
}
}
Run Code Online (Sandbox Code Playgroud)
并将其与内容控件和Caliburns View.Model附加机制一起使用
<xcad:DockingManager.LayoutItemTemplateSelector>
<avalonDock1:AutobinderTemplateSelector>
<avalonDock1:AutobinderTemplateSelector.Template>
<DataTemplate>
<ContentControl cal:View.Model="{Binding . }" IsTabStop="False" />
</DataTemplate>
</avalonDock1:AutobinderTemplateSelector.Template>
</avalonDock1:AutobinderTemplateSelector>
</xcad:DockingManager.LayoutItemTemplateSelector>
Run Code Online (Sandbox Code Playgroud) 我正在使用AvalonDock 2.0,当我打开一个dock容器时,在调试模式下应用程序崩溃(它在没有调试的情况下运行时工作正常).我得到以下异常:
WindowsBase.dll中发生了未处理的"System.ComponentModel.Win32Exception"类型异常
附加信息:操作成功完成
我遇到了这个答案,建议取消选中"例外设置"中的框.有线的事情是它第一次使用它.但它不再存在了.我试过其他机器也不行.任何有关如何解决此问题的建议.
Avalon代码(第5行引发的异常)
protected override IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
if (msg == Win32Helper.WM_WINDOWPOSCHANGING) {
if (_internalHost_ContentRendered) {
// the below line throw the exception
Win32Helper.SetWindowPos(_internalHwndSource.Handle, Win32Helper.HWND_TOP, 0, 0, 0, 0, Win32Helper.SetWindowPosFlags.IgnoreMove | Win32Helper.SetWindowPosFlags.IgnoreResize);
}
}
return base.WndProc(hwnd, msg, wParam, lParam, ref handled);
}
Run Code Online (Sandbox Code Playgroud) 我已经看到了一些关于SO的问题,但它们似乎都不适用于我.我希望能够使用带有Prism 4 的伟大的Avalondock 2.0.但是,所有的样本区域适配器都适用于Avalondock 1.x系列,我无法使其工作.
有没有人有关于如何为AvalonDock的LayoutDocumentPane和LayoutAnchorablePane创建Region Adapter的示例代码?
为了保存和加载我的布局,我遵循了这里的说明,但它对我不起作用.
我在XAML里面有这个MainWindow:
<StackPanel Orientation="Vertical">
<Button Content="Save"
Click="SaveButton_Click"/>
<Button Content="Load"
Click="LoadButton_Click"/>
<ad:DockingManager x:Name="myDM">
<ad:LayoutRoot>
<ad:LayoutPanel>
<ad:LayoutDocumentPane>
<ad:LayoutDocument Title="Document">
<TextBox />
</ad:LayoutDocument>
</ad:LayoutDocumentPane>
</ad:LayoutPanel>
<ad:LayoutRoot.LeftSide>
<ad:LayoutAnchorSide>
<ad:LayoutAnchorGroup>
<ad:LayoutAnchorable Title="Left">
<TextBox/>
</ad:LayoutAnchorable>
</ad:LayoutAnchorGroup>
</ad:LayoutAnchorSide>
</ad:LayoutRoot.LeftSide>
</ad:LayoutRoot>
</ad:DockingManager>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
这些是按钮点击的事件处理程序:
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(myDM);
using (var writer = new StreamWriter("test"))
{
layoutSerializer.Serialize(writer);
}
}
private void LoadButton_Click(object sender, RoutedEventArgs e)
{
XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(myDM);
using (var reader = …Run Code Online (Sandbox Code Playgroud) 我正在尝试禁用掉落目标,除了avalon dock中的中心目标.在codeplex中找不到任何文档.我发现了一个计算器类似的问题在这里,但没有正确的反应如此反复询问.
我有一个TabControl允许用户管理以下文档的文件:

在某些时候,我想添加一个功能,允许用户浮动TabItems 并将它们停靠回与TabControl您在 Visual Studio 中可以做的事情差不多的地方。此功能将允许用户更轻松地比较文档并在它们之间复制/粘贴等。
我有一些关于如何去做这件事的一般想法。该TabControl有其ItemsSource必然的文档视图模型的列表。
要浮动选项卡:
Thumb控件添加到TabItem.Thumb,关联的文档视图模型将从TabControl列表中删除。Window被打开,与文档视图模型绑定,以显示/编辑该文档。要停靠选项卡:
DragOver事件处理程序TabControl以识别Window拖过选项卡条区域的文档。TabControl列表中。Window已关闭。有没有关于如何做到这一点的例子,或者你有办法做到这一点?
谢谢。
我一直在使用DockManager和。LayoutRootLayoutAnchorablePaneLayoutDocumentPane
<ad:DockingManager x:Name="dockManager" >
<adLayout:LayoutRoot>
<adLayout:LayoutPanel x:Name="myLayoutPanel" Orientation="Horizontal">
<adLayout:LayoutAnchorablePane x:Name="myLayoutAnchorablePane" DockWidth="400"/>
<adLayout:LayoutDocumentPane x:Name="myDocumentPane" ChildrenCollectionChanged="myDocumentPane_ChildrenCollectionChanged"/>
</adLayout:LayoutPanel>
</adLayout:LayoutRoot>
</ad:DockingManager>
Run Code Online (Sandbox Code Playgroud)
然而,我遇到的一个问题是DockManager.LogicalChildren,当我关闭窗口时,进入 的ContentPresenter和 my永远不会被删除,并且会越来越多,直到它开始减慢应用程序的速度。UserControlLayoutDocumentLogicalChildren
当我检测到 时ChildrenCollectionChanged,如何删除与之关联的ContentPresenter和?UserControlLayoutDocument
编辑1:好的,也是LogicalChildren,System.Linq.Enumerable.WhereSelectListIterator<System.WeakReference,object>所以我无法从该列表中删除任何内容(而且它只有一个get,并且没有set)。
该LayoutDocumentPane.RemoveChild()方法不会对 执行任何操作DockingManager.LogicalChildren,因此我无法弄清楚 是LogicalChildren从哪里提取迭代日期的。
编辑2:所以,我尝试向DocumentClosing事件处理程序添加一个事件DockManager,但它似乎仍然没有LogicalChildren从 DockManager 中删除未使用的事件。
void dockManager_DocumentClosing(object sender, Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e) {
UserControl uc = e.Document.Content as UserControl;
e.Cancel …Run Code Online (Sandbox Code Playgroud) 我熟悉Caliburn Micro及其使用的范例,但我现在正在尝试集成AvalonDock.
作为一个POC,我有一个非常简单的应用程序,其中一个shell视图模型包含一个按钮,用于激活我的StructureViewModels - 一个包含名称和标题的简单类.结构视图是一个用户控件,它只是将名称显示为文本.
ViewModel和Views正在使用Caliburn很好地连接,它们正在Docking Manager中显示.我可以拖动和分离,枚举窗格等 - 所有Avalon功能似乎都有效.我遇到的问题是它们在Avalon标题(标签)中没有标题显示.

ShellViewModel:
using AvalonDemo.Properties;
using Caliburn.Micro;
namespace AvalonDemo.ViewModels
{
public class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{
private int _structureCount;
public ShellViewModel()
{
WindowTitle = Resources.MainWindowTitle;
_structureCount = 1;
}
public string WindowTitle { get; set; }
public void OpenStructure()
{
ActivateItem(new StructureViewModel
{
Name = "Structure" + _structureCount++,
Title = "Structure" + _structureCount
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑解决方案:
ShellView:
<Window x:Class="AvalonDemo.Views.ShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:avalonDock="http://schemas.xceed.com/wpf/xaml/avalondock"
xmlns:cal="http://www.caliburnproject.org"
xmlns:common="clr-namespace:AvalonDemo.Common"
Title="{Binding WindowTitle}"
Height="850" Width="1200">
<Grid>
<Grid.RowDefinitions>
<RowDefinition …Run Code Online (Sandbox Code Playgroud) 我需要在 AvalonDock 2.0 中加载一组项目作为文档。这些对象从一个抽象类继承,我想根据子类在文档中呈现一个框架。
这是我的 XAML:
<ad:DockingManager Background="Gray" DocumentsSource="{Binding Path=OpenProjects}"
ActiveContent="{Binding Path=CurrentProject, Mode=TwoWay}">
<ad:DockingManager.DocumentHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=OpenProjects/Name}" />
</DataTemplate>
</ad:DockingManager.DocumentHeaderTemplate>
<ad:DockingManager.LayoutItemTemplate>
<DataTemplate>
<Grid>
<Grid.Resources>
<DataTemplate DataType="{x:Type vm:SubclassAViewModel}">
<Frame Source="Pages/SubclassAProject.xaml" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SubclassBViewModel}">
<Frame Source="Pages/SubclassBProject.xaml" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SubclassCViewModel}">
<Frame Source="Pages/SubclassCProject.xaml" />
</DataTemplate>
</Grid.Resources>
</Grid>
</DataTemplate>
</ad:DockingManager.LayoutItemTemplate>
<ad:LayoutRoot>
<ad:LayoutPanel>
<ad:LayoutDocumentPaneGroup>
<ad:LayoutDocumentPane>
</ad:LayoutDocumentPane>
</ad:LayoutDocumentPaneGroup>
</ad:LayoutPanel>
</ad:LayoutRoot>
</ad:DockingManager>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经实现了显示与OpenProjects集合中项目一样多的文档,但我似乎无法在每个文档中显示任何内容。
另外,我不知道我ActiveContent是否正确使用:我想分配给CurrentProject当前活动文档上分配的 ViewModel。
感谢您的时间。
与我之前关于使浮动窗口独立于主 DockingManager 的问题相关,这里有一个类似但希望更简单的问题:
AvalonDock 浮动窗口是否可以设置为不位于主 DockingManager 窗口的“Always On Top”?
我正在翻阅AvalonDock 源代码,试图找到一种方法来做到这一点,但我还没有找到任何可行的方法。
理想情况下,我追求的是与 Visual Studio 具有相同效果的东西Tools > Options > Environment > Tabs and Windows > Floating tool windows always stay on top of the main window(至少在 VS2013 和 VS2015 中可用)。