一个 WPF 文档和工具窗口布局容器

一个 WPF 文档和工具窗口布局容器、用于排列文档 和工具窗口的方式与许多知名 IDE 类似,例如 Eclipse、Visual Studio、 PhotoShop 等等

AvalonDock 是一个 WPF 文档和工具窗口布局容器,用于排列文档 和工具窗口的方式与许多知名 IDE 类似,例如 Eclipse、Visual Studio、 PhotoShop 等等。

从源代码构建 AvalonDock (推荐)

此项目支持多目标框架(NetCore 3 和 .Net 4)。这意味着它需要 Visual Studio Community 2019 或更好的版本。

演示屏幕截图


开源地址

AvalonDock

实际简单使用查看下面代码

csharp 复制代码
<Page
    x:Class="FlightControlComputer.Views.Pages.RS422Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:avalonDock="https://github.com/Dirkster99/AvalonDock"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:FlightControlComputer.Views.Pages"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
    Title="RS422Page"
    d:DesignHeight="450"
    d:DesignWidth="800"
    UseLayoutRounding="True"
    mc:Ignorable="d">
    <DockingManager
        x:Name="dockManager"
        Grid.Row="1"
        AllowMixedOrientation="True"
        AutoWindowSizeWhenOpened="True"
        IsVirtualizingAnchorable="True"
        IsVirtualizingDocument="True">
        <DockingManager.ContextMenu>
            <ContextMenu>
                <MenuItem Click="ShowSerialPage_Click" Header="一个数据区" />
                <MenuItem Click="ShowDataPage_Click" Header="二个数据区" />
            </ContextMenu>
        </DockingManager.ContextMenu>
        <DockingManager.Theme>
            <Vs2013LightTheme />
        </DockingManager.Theme>
        <DockingManager.DocumentHeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Margin="0,0,4,0" Source="{Binding IconSource}" />
                    <TextBlock Text="{Binding Title}" TextTrimming="CharacterEllipsis" />
                </StackPanel>
            </DataTemplate>
        </DockingManager.DocumentHeaderTemplate>

        <LayoutRoot>
            <!--  Only include the left side layout for docking  -->
            <LayoutPanel Orientation="Horizontal">
                <!--<LayoutAnchorablePaneGroup DockWidth="50">-->
                <LayoutAnchorablePane DockWidth="50">
                    <LayoutAnchorable
                            Title="一个数据区"
                            ContentId="toolWindow1"
                            Hiding="OnToolWindow1Hiding">
                        <StackPanel MinHeight="450">
                             <!--  一个数据区窗口 的界面代码这里实现 -->
                        </StackPanel>
                    </LayoutAnchorable>
                    
                    
                </LayoutAnchorablePane>
                <LayoutAnchorablePane DockWidth="50">
                    <LayoutAnchorable Title="二个数据区" ContentId="toolWindow2">
                        <!--  另一个数据区窗口界面代码这里实现   --> 
                             
                        </Grid>
                    </LayoutAnchorable>
                </LayoutAnchorablePane>
                    <!--</LayoutAnchorablePaneGroup>-->
            </LayoutPanel>



        </LayoutRoot>
    </DockingManager>

</Page>

后台代码

csharp 复制代码
//关键代码
 #region TestBackground

        /// <summary>
        /// TestBackground Dependency Property
        /// </summary>
        public static readonly DependencyProperty TestBackgroundProperty =
            DependencyProperty.Register("TestBackground", typeof(Brush), typeof(RS422Page),
                new FrameworkPropertyMetadata((Brush)null));

        /// <summary>
        /// Gets or sets the TestBackground property.  This dependency property 
        /// indicates a randomly changing brush (just for testing).
        /// </summary>
        public Brush TestBackground
        {
            get => (Brush)GetValue(TestBackgroundProperty);
            set => SetValue(TestBackgroundProperty, value);
        }

        #endregion
        #region FocusedElement

        /// <summary>
        /// FocusedElement Dependency Property
        /// </summary>
        public static readonly DependencyProperty FocusedElementProperty =
            DependencyProperty.Register("FocusedElement", typeof(string), typeof(RS422Page),
                new FrameworkPropertyMetadata((IInputElement)null));

        /// <summary>
        /// Gets or sets the FocusedElement property.  This dependency property 
        /// indicates ....
        /// </summary>
        public string FocusedElement
        {
            get => (string)GetValue(FocusedElementProperty);
            set => SetValue(FocusedElementProperty, value);
        }

        #endregion
       
    
        private void OnLayoutRootPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            var activeContent = ((LayoutRoot)sender).ActiveContent;
            if (e.PropertyName == "ActiveContent")
            {
                Debug.WriteLine(string.Format("ActiveContent-> {0}", activeContent));
            }
        }

        private void ShowSerialPage_Click(object sender, RoutedEventArgs e)
        {
            var toolWindow1 = dockManager.Layout.Descendents().OfType<LayoutAnchorable>().Single(a => a.ContentId == "toolWindow1");
            if (toolWindow1.IsHidden)
                toolWindow1.Show();
            else if (toolWindow1.IsVisible)
                toolWindow1.IsActive = true;
            else
                toolWindow1.AddToLayout(dockManager, AnchorableShowStrategy.Bottom | AnchorableShowStrategy.Most);
        }

        private void ShowDataPage_Click(object sender, RoutedEventArgs e)
        {
            var toolWindow1 = dockManager.Layout.Descendents().OfType<LayoutAnchorable>().Single(a => a.ContentId == "toolWindow2");
            if (toolWindow1.IsHidden)
                toolWindow1.Show();
            else if (toolWindow1.IsVisible)
                toolWindow1.IsActive = true;
            else
                toolWindow1.AddToLayout(dockManager, AnchorableShowStrategy.Bottom | AnchorableShowStrategy.Most);

        }
相关推荐
小北方城市网17 分钟前
MongoDB 分布式存储与查询优化:从副本集到分片集群
java·spring boot·redis·分布式·wpf
听麟13 小时前
HarmonyOS 6.0+ 智慧出行导航APP开发实战:离线地图与多设备位置协同落地
华为·wpf·harmonyos
笨蛋不要掉眼泪1 天前
Spring Boot + RedisTemplate 数据结构的基础操作
java·数据结构·spring boot·redis·wpf
LcVong2 天前
WPF MediaPlayer获取网络视频流当前帧并展示图片完整范例
网络·wpf
bugcome_com2 天前
WPF数据绑定入门:从传统事件到5种绑定模式
wpf
LateFrames2 天前
我用 WPF 做了一个 “苍蝇飞舞” 的屏保
ui·wpf
wuty0072 天前
完善基于WPF开发的标尺控件(含实例代码)
wpf·wpf标尺·支持横向竖向标尺·ruler
浩浩测试一下3 天前
洪水猛兽攻击 Ddos Dos cc Drdos floods区别
安全·web安全·网络安全·系统安全·wpf·可信计算技术·安全架构
无心水3 天前
分布式环境下定时任务与SELECT FOR UPDATE的陷阱与解决方案
分布式·后端·wpf·xxl-job·quartz·定时任务·selectforupdate
xdpcxq10293 天前
Spring AOP + Guava RateLimiter 用注解实现优雅限流
spring·wpf·guava