一个 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);

        }
相关推荐
闲云自留地2 小时前
OpenStack 的身份管家:Keystone 令牌、RBAC 权限模型拆解
wpf·openstack
FuckPatience2 天前
WPF 窗体唤醒,判断是否已存在,存在则弹出
wpf
程序员清风2 天前
从单体应用到微服务:后端系统拆分的基本方法
微服务·架构·wpf
FuckPatience3 天前
WPF 改变根据某一列条件改变行样式
wpf
dalong104 天前
WPF:DataGrid样式
wpf
samble6 天前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
姜穆澜6 天前
OneID 从 0 到 1 完整生产案例(三)
大数据·wpf
dalong106 天前
WPF:MVVM 示例
大数据·wpf
samble6 天前
从零搭建工业控制系统(二十一):状态管理系统——中心状态对象设计
c#·wpf·mvvm·状态管理·工业控制
mengge.cloud7 天前
存储技术基础小白教程
linux·运维·服务器·wpf·存储