我有以下代码给一个未对接的浮动AvalonDock窗口最大化的能力:
class MaximizableDockableContent : AvalonDock.DockableContent
{
public MaximizableDockableContent()
: base()
{
base.StateChanged += MaximizableDockableContent_StateChanged;
}
private void MaximizableDockableContent_StateChanged(
object sender, RoutedEventArgs e)
{
MaximizableDockableContent mdc = (MaximizableDockableContent)sender;
if (mdc.State == DockableContentState.DockableWindow)
{
base.FloatingWindowSizeToContent = SizeToContent.WidthAndHeight;
FloatingDockablePane fdp = (FloatingDockablePane)base.Parent;
DockableFloatingWindow dfw = (DockableFloatingWindow)fdp.Parent;
//dfw.WindowState = WindowState.Maximized;
dfw.WindowStyle = WindowStyle.ThreeDBorderWindow;
dfw.ResizeMode = ResizeMode.CanResize;
//disable minimize button
ControlBox.SetHasMinimizeButton(dfw, false);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何为此添加Aero Snap功能?
我面临的问题是,在加载旧布局后,我无法打开类型X的锚定.仅当我在保存布局之前关闭了类型X的可锚定时才会发生这种情况.
AvalonDock有没有类似的问题?这是AvalonDock的错误吗?经过多年的调试,我担心在ViewModel中进行<Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/>更改时,视图中的绑定无法正确更新IsActive.AvalonDock应该负责这项任务.但也许问题是加载和保存布局?
视图
Loaded我DockingManager在我的视图中的事件加载我的anchorables(=工具窗口)的保存布局像这样(简化):
string savedLayout = Properties.Settings.Default.Layout;
XmlDocument doc = new XmlDocument();
doc.LoadXml(savedLayout);
// very simplified code. load saved xml layout and add anchorables to the dockmanager
doc.SelectNodes("//LayoutAnchorable").OfType<XmlNode>().ToList().ForEach(anchorable =>
{
this.DockManager.AnchorablesSource.Add(anchorable);
});
Run Code Online (Sandbox Code Playgroud)
我正在我的视图中的Closing事件中保存我的anchorables的当前布局,MainWindow如下所示(简化):
XmlDocument doc = new XmlDocument();
XmlLayoutSerializer xmlLayoutSerializer = new XmlLayoutSerializer(this.DockManager);
using (MemoryStream stream = new MemoryStream())
{
xmlLayoutSerializer.Serialize(stream);
stream.Seek(0, SeekOrigin.Begin);
doc.Load(stream);
}
// here happens some magic. i think …Run Code Online (Sandbox Code Playgroud) 我正在尝试将应用程序中的AvalonDock从1.3升级到2.0,但几乎没有关于此的文档.
我看一下简单,通过这样做导入它
xmlns:avalonDock="http://avalondock.codeplex.com"
Run Code Online (Sandbox Code Playgroud)
但是这没用.
Error The tag 'DockingManager' does not exist in XML namespace 'http://avalondock.codeplex.com'. Line 41 Position 10.
Run Code Online (Sandbox Code Playgroud)
我也用旧方式试了一下.
xmlns:avalonDock="clr-namespace:AvalonDock;assembly=AvalonDock"
Run Code Online (Sandbox Code Playgroud)
这也没有奏效
Error The tag 'ResizingPanel' does not exist in XML namespace 'clr-namespace:AvalonDock;assembly=AvalonDock'. Line 71 Position 22.
Run Code Online (Sandbox Code Playgroud)
如果他们重命名了控件,那么拥有2.0中现在存在的控件列表会很有用.
我试图编译简单的代码,但没有成功.
我试图在我的wpf应用程序中使用AvalonDock,这是一个MVVM应用程序.环顾四周,我找不到任何示例应用程序显示我该怎么做.
AlavonDock表示它对MVVM有本机支持,所以它应该很容易支持mvvm,但是没有示例代码.
我的问题是:
有没有人设法使用Prism模块和AvalonDock的动态注入视图成功加载和保存布局?
我有一个用于AvalonDock DockingManager的RegionAdapter,它允许我在Prism模块中使用RegionViewRegistry注册视图,它们被AvalonDock中的LayoutAnchorable对象包装.
这一切都正常,除了保存和加载布局.当我从我的模块中添加一个视图时,它会通过RegionAdapter并正确序列化(我有一个后序列化步骤,它将一些自定义XML添加到输出中,以便为我提供有关在LayoutAnchorable中显示的模块的一些信息).
当我加载布局时,我实现了LayoutSerializationCallback,将内容设置为适当的模块视图并正确显示.
问题是如果我随后尝试序列化,我永远不会得到反序列化中添加的LayoutAnchorables.
我有兴趣听到任何设法创建AvalonDock + Prism +布局保存和加载的人.
我对Infragistics和SyncFusion的DockManagers进行了评估,并且取得了更少的成功,它们都没有在反序列化上提供回调以允许我注入我的自定义视图.
使用一组Anchorables设置AvalonDock时,例如:
<a:LayoutRoot>
<a:LayoutPanel Orientation="Horizontal">
<a:LayoutAnchorablePane>
<a:LayoutAnchorable Title="A1">
<!-- content -->
</a:LayoutAnchorable>
<a:LayoutAnchorable Title="A2">
<!-- content -->
</a:LayoutAnchorable>
</a:LayoutAnchorablePane>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)
DockingManager(或AvalonDock中的其他东西)是否有内置的方式来管理已关闭的Anchorables?它们是否存储在某个地方的集合中,以便可以检索并再次显示它们?
例如,用户从上面的代码中关闭第一个(A1),会发生什么?
如何再次显示?
处理关闭和恢复锚点的典型工作流程是什么?
我创建了一个使用AvalonDock框架的应用程序.关键部分是使用AvalonDock.DocumentContent派生编辑器编辑域模型实体的能力.我遇到了一个问题,发现我的编辑在关闭并从DockingManager.Documents集合中删除后没有被垃圾收集.
经过一些徒劳无功的搜索后,我创建了一个小型测试应用程序,可以通过以下方式重新创建:
AvalonDockLeak;Document;将Document.xmal更改为:
<ad:DocumentContent x:Class="AvalonDockLeak.Document"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock">
<Grid>
<TextBox />
</Grid>
</ad:DocumentContent>
Run Code Online (Sandbox Code Playgroud)将Document.xmal.cs更改为:
namespace AvalonDockLeak
{
using AvalonDock;
public partial class Document : DocumentContent
{
public Document()
{
InitializeComponent();
}
~Document()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我添加的析构函数能够诊断问题,在方法打开时添加一个断点{,并查看它是否被击中.它总是关闭测试应用程序,但不是更早.
现在将Window1.xaml更改为:
<Window x:Class="AvalonDockLeak.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock"
Title="Memory Leak Test" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button Name="NewButton" Click="NewButton_Click" Content="New" Height="26" Width="72" />
<ad:DockingManager x:Name="DockManager" Grid.Row="1">
<ad:DocumentPane /> …Run Code Online (Sandbox Code Playgroud)是否可以防止锚定停靠在我的文档窗格中?我希望它们可以拖动并在屏幕上移动,但有时用户将它们拖到文档窗格中,这使它们看起来很差.然后他们关闭标签,我无法重新打开可锚定的.
如果它有助于我的Avalon代码如下:
<avalonDock:DockingManager.Theme>
<avalonDock:VS2010Theme />
</avalonDock:DockingManager.Theme>
<avalonDock:DockingManager.DocumentHeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<!-- the TextBlock named Limiter is used to limit the height of the TextBlock for the workflow name. -->
<TextBlock x:Name="Limiter" TextWrapping="NoWrap" Visibility="Hidden"
TextTrimming="CharacterEllipsis">
L
</TextBlock>
<TextBlock Text="{Binding Path=Title}" VerticalAlignment="Center"
ToolTip="{StaticResource WorkflowTabItemToolTip}"
MaxHeight="{Binding ActualHeight, ElementName=Limiter}" MaxWidth="150"
TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Margin="0,0,2,0"
AutomationProperties.AutomationId="WorkflowTabTitleText"/>
<TextBlock Text=" *"
ToolTip="Has unsaved changes"
Visibility="{Binding Content.UnsavedEdits, Converter={StaticResource BoolToVis}}"
AutomationProperties.AutomationId="DirtyTabIndicator"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</avalonDock:DockingManager.DocumentHeaderTemplate>
<avalonDock:DockingManager.LayoutItemContainerStyleSelector>
<utilities1:PanesStyleSelector>
<utilities1:PanesStyleSelector.WebUIStyle>
<Style TargetType="{x:Type avalonDock:LayoutAnchorableItem}">
<Setter Property="Title" Value="{Binding Model.Title}"/>
<Setter Property="IconSource" Value="{Binding …Run Code Online (Sandbox Code Playgroud) 我的应用程序是围绕AvalonDock构建的,它具有相当不错的Visual Studio 2010外观(比其他所有外观更漂亮).现在我想为我的应用程序的其余部分设计样式.我对以下部分最感兴趣:
这些风格是在网络上的某个地方吗?或者它们可以以某种方式从VS中提取出来?
谢谢你的帮助.
我正在使用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)