在使用OpenExpressApp框架工作中,我们将开源的AvalonDock控件作为界面布局来应用。

AvalonDock是在codeplex上的一个开源项目,专门用于WPF的界面布局,可以做成类似visual studio这样的界面,个人感觉是相当不错的,而且简单易用。 像下面这样的界面用AvalonDock很快就能做出来:

有兴趣的话,大家可以去codeplex上下载源代码和例子, 相信很快就能学会。但是本文的重点不在这里,我要说的是在使用AvalonDock时遇到的一个问题。先来看下需求吧,其实很简单,我就是想点击一个按钮能弹出泊靠在底部的DockablePane。效果如下:

点击前:

点击后:

我的代码如下,XAML:

代码

<Grid>
        <ad:DockingManager x:Name="dockManager">
            <ad:ResizingPanel Orientation="Vertical">
                <ad:ResizingPanel Orientation="Horizontal">
                    <ad:DocumentPane x:Name="documentsHost">
                        <ad:DocumentContent Title="File1.doc">
                            <RichTextBox/>
                        </ad:DocumentContent>
                        <ad:DocumentContent Title="File2.doc">
                            <Button x:Name="btn1" Click="btn1_Click" Content="click" Width="300" Height="50" ></Button>
                        </ad:DocumentContent>
                    </ad:DocumentPane>
                </ad:ResizingPanel>
                <ad:DockablePane ad:ResizingPanel.ResizeHeight="200" x:Name="pane"/>
            </ad:ResizingPanel>
        </ad:DockingManager>
</Grid>

对应的CS文件:

代码

private void btn1_Click(object sender, RoutedEventArgs e)
{
      DockableContent dc = new DockableContent();
      TextBox tb = new TextBox();
      dc.Content = tb;
      dc.HideOnClose = true;
      dc.Title = "Test";
      this.pane.Items.Add(dc);
      this.dockManager.Show(dc);
}

写完运行,点击按钮,但是却一点儿反应都没有。更奇怪的是,当我拖动窗体的边框时,DockablePane自己却跳出来了。难道说DockablePane信春哥,原地复活么~

其实玄机就出在Show方法上,打开源代码,发现Show方法的末尾是这样写的:

代码

if (content.ActualWidth == 0.0 && (
       dockParent.Anchor == AnchorStyle.Left || dockParent.Anchor == AnchorStyle.Right))
{
       ResizingPanel.SetResizeWidth(dockParent, new GridLength(200));
       ResizingPanel.SetEffectiveSize(dockParent, new Size(200, 0.0));
}
else if (content.ActualWidth == 0.0 && (
        dockParent.Anchor == AnchorStyle.Left || dockParent.Anchor == AnchorStyle.Right))
{
        ResizingPanel.SetResizeWidth(dockParent, new GridLength(200));
        ResizingPanel.SetEffectiveSize(dockParent, new Size(200, 0.0));
}

相信大家一眼就能看出来,if语句中的两个条件完全一样,而且执行的语句块也是一摸一样。问题就出在这里,AnchorStyle枚举总共有5个值(Top,Bottom,None,Left,Right),我调用的是一个参数的Show方法,默认的AnchorStyle是AnchorStyle.None,而且我的需求是底部,就算给也应该是AnchorStyle.Bottom。所以说修改如下:

代码

DockablePane dockParent = content.ContainerPane as DockablePane;
dockParent.Anchor = desideredAnchor;
if (content.ActualWidth == 0.0 && (dockParent.Anchor!=AnchorStyle.None))
{
       ResizingPanel.SetResizeWidth(dockParent, new GridLength(200));
       ResizingPanel.SetEffectiveSize(dockParent, new Size(200, 0.0));
}

现在点击按钮,DockablePane就如约而至了。但是其实还是有问题,就是我在调用Show方法的时候就要这么this.dockManager.Show(dc,DockableContentState.Docked,AnchorStyle.Bottom);

但是当我改为Top,Left,Right时,期望出现对应的效果,但是最终仍然出现在了底部。而且当我给None的时候,表面上看DockablePane没有弹出来,但是一旦拖动窗体大小,就又出来了。还有ResizingPanel.SetEffectiveSize(dockParent, new Size(200, 0.0));似乎没起到作用,我把它注释掉,依然能弹出DockablePane,我再好好琢磨一下,希望能看到本质,这里先把这个问题提出来,我研究完了再来跟大家分享,大家有兴趣的话一起研究下~

转载于:https://www.cnblogs.com/1231net/archive/2009/12/14/1623424.html

WPF布局控件AvalonDock介绍以及应用中遇到的一个问题相关推荐

  1. WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系

    WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系: 1.Canvas/WrapPanel控件: 其子控件的HorizontalAlign ...

  2. WPF 基本控件的介绍

    1.Border 放到其他控件内部,给其他控件画边框,其他容器必须支持双标签. 2.Button 按钮,按钮用图片应该设置内容为Image,而不能设置BackGroud为Image,如果 只设置背景, ...

  3. WPF布局控件Grid的基本使用 - 使用kaxaml

    Grid是以表格形式组织控件的一种布局方式: WPF中的Grid的每一个单元格中可以放置一个或多个控件: WPF中的Grid支持单元格的合并: Grid中的行和列可以自定义高度(Height)和宽度( ...

  4. WPF布局控件之WrapPanel

    WrapPanel WrapPanel,英文意思是折叠容器,那到底是怎么个折叠法呢?如下: <Window x:Class="LearnLayout.WrapPanelWin" ...

  5. WPF布局控件之StackPanel

    StackPanel Stack,英文意思是堆栈,StackPanel,意思是堆栈式布局,相当于把控件给堆起来.如果不设置StackPanel中控件的宽高,那么其中控件的宽高是默认和StackPane ...

  6. mfc在调整界面时左边的控件会丢失_Qt项目中如何完成一个漂亮的界面

    在Qt项目开发过程中,如何实现做出漂亮的界面呢? 一般来说,一个界面的完成是美工.开发者和用户共同完成的.美工完成UI设计,开发者完成实现,用户对UI提出修改意见.本文主要来探讨一下如何从UI设计到交 ...

  7. 【愚公系列】2023年07月 WPF+上位机+工业互联 002-WPF布局控件

    文章目录 前言 一.WPF布局控件 1.无边框设计 2.理解布局 2.1 WPF的布局处理 2.1 布局原则 2.3 布局过程 3.布局控件 3.1 Grid控件 3.1.1 属性 3.1.2 案例 ...

  8. C# .NET 6.0已经取消了Framework 4.8的WebBrowser控件,几款NuGet中的浏览器控件介绍

    即使在C# .NET 6.0..NET 7.0在选择工具箱项COM组件添加Microsoft Web Browser,工具箱也没有WebBrowser控件. WebBrowser控件: WebBrow ...

  9. wpf初学者-wpf控件简单介绍

    本文大纲 1.基本控件介绍与用法. 基本控件介绍与用法 文本控件 Label控件 label控件:一般用户描述性文字显示. 在Label控件使用时,一般给予用户提示.用法上没有什么很特殊的,label ...

最新文章

  1. 拖放 DataGrid 列--来自MSDN
  2. Mac 技术篇-查看python安装位置,查看java安装位置
  3. 在VC中如何找到崩溃的源头
  4. 11.17 模拟:总结
  5. sqlserver拼接字符串换行_1.3【Python】第三章 字符串
  6. 大厂HR年底绷不住了:怎么招程序员这么难,尤其搞这项技术的!!
  7. 蚂蚁区块链正式升级为蚂蚁链:首次公布“日活”超1亿
  8. Java中Double保留后小数位的几种方法
  9. 如果你选择城市创业的话,可以先从小本生意做起
  10. LeetCode 153. 寻找旋转排序数组中的最小值(二分)
  11. mysql卸载rpm包_mysql彻底卸载(rpm安装包)
  12. Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决...
  13. 编程珠玑Column11中插入排序和快排序
  14. twitter关注排行榜
  15. 什么是跨域?怎么解决跨域问题
  16. 家用计算机中的内存大约多少,64gb内存能装多少东西_64gb内存有多大-系统城
  17. win11电脑所有的浏览器都上不了网怎么解决
  18. 强大的文字处理器——Nisus Writer Pro
  19. 蓝奏云密码破解软件v1.0
  20. Android,开源还是封闭?VS 关于 Linux “踢出” Android

热门文章

  1. 用python做逻辑回归_python实现逻辑回归
  2. Selenium自动化测试-3.元素定位(3)
  3. import 导入和from导入的区别
  4. Filecoin网络存储容量已达3 EB
  5. 医药/医疗/互联网医疗服务平台/问诊/挂号/开药/处方/医生/医院/问诊订单管理/移动端问诊医疗系统/医生端处方开药系统/web端医药服务平台管理/axure原型/rp源文件/健康咨询/视频问诊/统计
  6. spring的一些概念及优点
  7. [BJOI2017]树的难题 点分治,线段树合并
  8. TStringGrid - 重绘时RECT解决一块空白区域
  9. 桥接设计模式(Bridge)
  10. [转]细说Redis监控和告警