精华内容
下载资源
问答
  • 开源C# WPF控件库强力推荐

    千次阅读 2020-06-08 08:20:00
    点击上方“Dotnet9”添加关注哦开源C# WPF控件库及项目推荐本系列已介绍四款开源C# WPF控件库,其中一款国外的,另三款是国内的,大家如有比较好的开源C# WPF控件库,欢迎向...

    点击上方“Dotnet9”添加关注哦

    开源C# WPF控件库及项目推荐

    本系列已介绍四款开源C# WPF控件库,其中一款国外的,另三款是国内的,大家如有比较好的开源C# WPF控件库,欢迎向Dotnet9推荐(公众号无留言功能,可在本站留言推荐):

    1、MaterialDesignInXAML。

    本站详细介绍网址: https://dotnet9.com/2180.html[1]

    Github地址: https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit[2]

    看star和fork量,就知道有多优秀了:

    Github项目情况

    放上官方Demo截图:

    控件库Demo

    该库控件种类繁多,主题也丰富,下面是依据此库开源的一个WPF开源项目《Accelerider.Windows[3]》:

    开源WPF项目:Accelerider.Windows

    2、Panuon.UI.Silver

    本站详细介绍网址:https://dotnet9.com/2285.html[4]

    Github地址:https://github.com/Panuon/PanuonUI.Silver[5]

    Github项目情况

    根据该库开发的一款音乐播放软件魔音MORIN[6]:

    魔音MORIN

    3、HandyControl

    本站详细介绍网址:https://dotnet9.com/2397.html[7]

    Github地址:https://github.com/HandyOrg/HandyControl[8]

    Github项目情况

    Demo中黑色主题截图:

    黑色主题

    4、AduSkin

    本站详细介绍网址:https://dotnet9.com/9373.html[9]

    Github地址:https://github.com/aduskin/AduSkin[10]

    Github项目情况
    控件库全貌

    此库样例:

    AduChat

    最后

    站长参考以上项目,也做了一个开源项目TerminalMACS[11],欢迎star:

    TerminalMACS

    如有比较好的开源C# WPF控件库,欢迎向站长留言。

    [1]

    https://dotnet9.com/2180.html: https://dotnet9.com/2180.html

    [2]

    https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit: https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit

    [3]

    Accelerider.Windows: https://dotnet9.com/732

    [4]

    https://dotnet9.com/2285.html: https://dotnet9.com/2285.html

    [5]

    https://github.com/Panuon/PanuonUI.Silver: https://github.com/Panuon/PanuonUI.Silver

    [6]

    魔音MORIN: http://www.huanghunxiao.com/

    [7]

    https://dotnet9.com/2397.html: https://dotnet9.com/2397.html

    [8]

    https://github.com/HandyOrg/HandyControl: https://github.com/HandyOrg/HandyControl

    [9]

    https://dotnet9.com/9373.html: https://dotnet9.com/9373.html

    [10]

    https://github.com/aduskin/AduSkin: https://github.com/aduskin/AduSkin

    [11]

    TerminalMACS: https://github.com/dotnet9/TerminalMACS/tree/master/src/TerminalMACS.Manager/TerminalMACS.ManagerForWPF

    关注Dotnet9,分享更多好文

    如果本文对你有用,

    不妨点个“在看”或者转发朋友圈

    ????点击阅读原文

    展开全文
  • 主要包含以下要素: 1.WPF常用控件的重写 2.可以用来实现QQ音乐播放器界面 3.控件内事件的实现 4.毛玻璃效果 另外,该可以直接通过引用使用,有兴趣的同学可以下载学习
  • wpf 几种常用控件样式

    2019-09-26 03:35:02
    转自:http://blog.csdn.net/xuejiren/article/details/39449515 转载于:https://www.cnblogs.com/dotnetHui/p/8495768.html

    转自:http://blog.csdn.net/xuejiren/article/details/39449515

    转载于:https://www.cnblogs.com/dotnetHui/p/8495768.html

    展开全文
  • WPF来说ContentControl和ItemsControl是最重要的两个控件。 顾名思义,ItemsControl表示可用于呈现一组Item的控件。大部分时候我们并不需要自定义ItemsControl,因为WPF提供了一大堆ItemsControl的派生类:...

    1. 前言

    对WPF来说ContentControl和ItemsControl是最重要的两个控件。

    顾名思义,ItemsControl表示可用于呈现一组Item的控件。大部分时候我们并不需要自定义ItemsControl,因为WPF提供了一大堆ItemsControl的派生类:HeaderedItemsControl、TreeView、Menu、StatusBar、ListBox、ListView、ComboBox;而且配合Style或DataTemplate足以完成大部分的定制化工作,可以说ItemsControl是XAML系统灵活性的最佳代表。不过,既然它是最常用的控件,那么掌握一些它的原理对所有WPF开发者都有好处。

    我以前写过一篇文章介绍如何模仿ItemsControl,并且博客园也已经很多文章深入介绍ItemsControl的原理,所以这篇文章只介绍简单的自定义ItemsControl知识,通过重写GetContainerForItemOverride和IsItemItsOwnContainerOverride、PrepareContainerForItemOverride函数并使用ItemContainerGenerator等自定义一个简单的IItemsControl控件。

    2. 介绍作为例子的Repeater

    作为教学我创建了一个继承自ItemsControl的控件Repeater(虽然简单,用来展示资料的话好像还真的有点用)。它的基本用法如下:

    <local:Repeater>
        <local:RepeaterItem Content="1234999"
                            Label="Product ID" />
        <local:RepeaterItem Content="Power Projector 4713"
                            Label="IGNORE" />
        <local:RepeaterItem Content="Projector (PR)"
                            Label="Category" />
        <local:RepeaterItem Content="A very powerful projector with special features for Internet usability, USB"
                            Label="Description" />
    </local:Repeater>
    

    也可以不直接使用Items,而是绑定ItemsSource并指定DisplayMemberPath和LabelMemberPath。

    public class Product
    {
        public string Key { get; set; }
    
        public string Value { get; set; }
    
        public static IEnumerable<Product> Products
        {
            get
            {
                return new List<Product>
                {
                    new Product{Key="Product ID",Value="1234999" },
                    new Product{Key="IGNORE",Value="Power Projector 4713" },
                    new Product{Key="Category",Value="Projector (PR)" },
                    new Product{Key="Description",Value="A very powerful projector with special features for Internet usability, USB" },
                    new Product{Key="Price",Value="856.49 EUR" },
                };
    
            }
        }
    }
    
    
    <local:Repeater ItemsSource="{x:Static local:Product.Products}"
                    DisplayMemberPath="Value"
                    LabelMemberPath="Key"/>
    

    运行结果如下图:

    3. 实现

    确定好需要实现的ItemsControl后,通常我大致会使用三步完成这个ItemsControl:

    1. 定义ItemContainer
    2. 关联ItemContainer和ItemsControl
    3. 实现ItemsControl的逻辑

    3.1 定义ItemContainer

    派生自ItemsControl的控件通常都会有匹配的子元素控件,如ListBox对应ListBoxItem,ComboBox对应ComboBoxItem。如果ItemsControl的Items内容不是对应的子元素控件,ItemsControl会创建对应的子元素控件作为容器再把Item放进去。

    <ListBox>
        <system:String>Item1</system:String>
        <system:String>Item2</system:String>
    </ListBox>
    

    例如这段XAML中,Item1和Item2是ListBox的LogicalChildren,而它们会被ListBox封装到ListBoxItem,ListBoxItem才是ListBox的VisualChildren。在这个例子中,ListBoxItem可以称作ItemContainer

    ItemsControl派生类的ItemContainer控件要使用父元素名称做前缀、-Item做后缀,例如ComboBox的子元素ComboBoxItem,这是WPF约定俗成的做法(不过也有TabControl和TabItem这种例外)。Repeater也派生自ItemsControl,Repeatertem即为Repeater的ItemContainer控件。

    public RepeaterItem()
    {
        DefaultStyleKey = typeof(RepeaterItem);
    }
    
    public object Label
    {
        get => GetValue(LabelProperty);
        set => SetValue(LabelProperty, value);
    }
    
    public DataTemplate LabelTemplate
    {
        get => (DataTemplate)GetValue(LabelTemplateProperty);
        set => SetValue(LabelTemplateProperty, value);
    }
    
    <Style TargetType="local:RepeaterItem">
        <Setter Property="Padding"
                Value="8" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:RepeaterItem">
                    <Border BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}">
                        <StackPanel Margin="{TemplateBinding Padding}">
                            <ContentPresenter Content="{TemplateBinding Label}"
                                              ContentTemplate="{TemplateBinding LabelTemplate}"
                                              VerticalAlignment="Center"
                                              TextBlock.Foreground="#FF777777" />
                            <ContentPresenter x:Name="ContentPresenter" />
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    上面是RepeaterItem的代码和DefaultStyle。RepeaterItem继承ContentControl并提供Label、LabelTemplate。DefaultStyle的做法参考ContentControl。

    3.2 关联ItemContainer和ItemsControl

    <Style TargetType="{x:Type local:Repeater}">
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility"
                Value="Auto" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Repeater}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}">
                        <ScrollViewer Padding="{TemplateBinding Padding}">
                            <ItemsPresenter />
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    如上面XAML所示,Repeater的ControlTemplate中需要提供一个ItemsPresenter,用于指定ItemsControl中的各Item摆放的位置。

    [StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(RepeaterItem))]
    public class Repeater : ItemsControl
    {
        public Repeater()
        {
            DefaultStyleKey = typeof(Repeater);
        }
    
        protected override bool IsItemItsOwnContainerOverride(object item)
        {
            return item is RepeaterItem;
        }
    
        protected override DependencyObject GetContainerForItemOverride()
        {
            var item = new RepeaterItem();
            return item;
        }
    }
    

    Repeater的基本代码如上所示。要将Repeater和RepeaterItem关联起来,除了使用约定俗成的命名方式告诉用户,还需要使用下面两步:

    重写 GetContainerForItemOverride
    protected virtual DependencyObject GetContainerForItemOverride () 用于返回Item的Container。Repeater返回的是RepeaterItem。

    重写 IsItemItsOwnContainer
    protected virtual bool IsItemItsOwnContainerOverride (object item),确定Item是否是(或者是否可以作为)其自己的Container。在Repeater中,只有RepeaterItem返回True,即如果Item的类型不是RepeaterItem,就将它作使用RepeaterItem包装起来。

    完成上面几步后,为Repeater设置ItemsSource的话Repeater将会创建对应的RepeaterItem并添加到自己的VisualTree下面。

    使用 StyleTypedPropertyAttribute

    最后可以在Repeater上添加StyleTypedPropertyAttribute,指定ItemContainerStyle的类型为RepeaterItem。添加这个Attribute后在Blend中选择“编辑生成项目的容器(ItemContainerStyle)”就会默认使用RepeaterItem的样式。

    3.3 实现ItemsControl的逻辑

    public string LabelMemberPath
    {
        get => (string)GetValue(LabelMemberPathProperty);
        set => SetValue(LabelMemberPathProperty, value);
    }
    
    /*LabelMemberPathProperty Code...*/
    
    protected virtual void OnLabelMemberPathChanged(string oldValue, string newValue)
    {
        // refresh the label member template.
        _labelMemberTemplate = null;
        var newTemplate = LabelMemberPath;
    
        int count = Items.Count;
        for (int i = 0; i < count; i++)
        {
            if (ItemContainerGenerator.ContainerFromIndex(i) is RepeaterItem RepeaterItem)
                PrepareRepeaterItem(RepeaterItem, Items[i]);
        }
    }
    
    private DataTemplate _labelMemberTemplate;
    
    private DataTemplate LabelMemberTemplate
    {
        get
        {
            if (_labelMemberTemplate == null)
            {
                _labelMemberTemplate = (DataTemplate)XamlReader.Parse(@"
                <DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                            xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
                		<TextBlock Text=""{Binding " + LabelMemberPath + @"}"" VerticalAlignment=""Center""/>
                </DataTemplate>");
            }
    
            return _labelMemberTemplate;
        }
    }
    
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);
    
        if (element is RepeaterItem RepeaterItem )
        {
            PrepareRepeaterItem(RepeaterItem,item);
        }
    }
    
    private void PrepareRepeaterItem(RepeaterItem RepeaterItem, object item)
    {
        if (RepeaterItem == item)
            return;
    
        RepeaterItem.LabelTemplate = LabelMemberTemplate;
        RepeaterItem.Label = item;
    }
    

    Repeater本身没什么复杂的逻辑,只是模仿DisplayMemberPath添加了LabelMemberPathLabelMemberTemplate属性,并把这个属性和RepeaterItem的Label和’LabelTemplate’属性关联起来,上面的代码即用于实现这个功能。

    LabelMemberPath和LabelMemberTemplate
    Repeater动态地创建一个内容为TextBlock的DataTemplate,这个TextBlock的Text绑定到LabelMemberPath

    XamlReader相关的技术我在如何使用代码创建DataTemplate这篇文章里讲解了。

    ItemContainerGenerator.ContainerFromIndex
    ItemContainerGenerator.ContainerFromIndex(Int32)返回ItemsControl中指定索引处的Item,当Repeater的LabelMemberPath改变时,Repeater首先强制更新了LabelMemberTemplate,然后用ItemContainerGenerator.ContainerFromIndex找到所有的RepeaterItem并更新它们的Label和LabelTemplate。

    PrepareContainerForItemOverride
    protected virtual void PrepareContainerForItemOverride (DependencyObject element, object item) 用于在RepeaterItem添加到UI前为其做些准备工作,其实也就是为RepeaterItem设置LabelLabelTemplate而已。

    4. 结语

    实际上WPF的ItemsControl很强大也很复杂,源码很长,对初学者来说我推荐参考Moonlight中的实现(Moonlight, an open source implementation of Silverlight for Unix systems),上面LabelMemberTemplate的实现就是抄Moonlight的。Silverlight是WPF的简化版,Moonlight则是很久没维护的Silverlight的简陋版,这使得Moonlight反而成了很优秀的WPF教学材料。

    当然,也可以参考Silverlight的实现,使用JustDecompile可以轻松获取Silverlight的源码,这也是很好的学习材料。不过ItemsControl的实现比Moonlight多了将近一倍的代码。

    5. 参考

    ItemsControl Class (System.Windows.Controls) Microsoft Docs
    moon_ItemsControl.cs at master
    ItemContainer Control Pattern - Windows applications _ Microsoft Docs

    展开全文
  • C# 封装WPF画箭头类库

    2020-08-28 11:52:28
    WPF开发过程中你可能会遇到类似流程或者范围指示这种标识,比较好的方式是使用箭头指示,但是很难找到自己刚好中意的。该类封装一个箭头绘制,可以指定直线斜线虚线,箭头方向以及对应说明文本的停靠位置,希望对...
  • WPF常用的第三方

    千次阅读 2019-04-25 16:01:41
    这里介绍的第三方基本都是开源的,并可通过NuGet或GitHub获得。 一、PropertyChanged.Fody 在使用MVVM模式开发的时候,ViewModel端需要加入RaisePropertyChanged的语句才能更新View。PropertyChanged.Fody解决了...

    这里介绍的第三方库基本都是开源的,并可通过NuGet或GitHub获得。

    一、PropertyChanged.Fody

    在使用MVVM模式开发的时候,ViewModel端需要加入RaisePropertyChanged的语句才能更新View。PropertyChanged.Fody解决了这个问题,让开发更简洁。

    注意如果使用.NET 4.5版本,加入1.50.3版本,否则会有问题。

    二、Stylet

    很小的MVVM框架,但功能很强大,省去了很多繁复的代码编写工作。

    三、ReoGrid

    如果你要在软件中加入类似Excel的功能,ReoGrid是个不错的选择。它支持Excel文件读写、有丰富的单元格样式、有强大的编辑功能。

    ReoGrid一开始是针对WindowForm开发的,后来支持WPF,但很多功能都没有。推荐在WPF里面嵌入Winform容器,才使用此控件的Winform版本。

    四、Live-Charts

    一个强大的图表插件,支持各种Chart,而且文件也不大。

    五、WpfAnimatedGif

    这是一个用来显示gif图的控件,比较过那么多项目,这个性能算是最好的,即使是要显示大量的gif图也不卡。

    展开全文
  • 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 ...有想法是非常不错的,但是,当你开始动手做的时候,会发现自己做的界面怎么看怎么不顺眼,控件怎么看怎么讨厌。这个时候,我们..
  • 首先,新建一个WPF自定义控件库项目 这里我们封装一个支持自己绘制形状的图片按钮,且支持图片和文字。 运行效果如下:(形状是我随便绘的) 将默认的CustomControl1.cs改成ImageButton.cs 这个...
  • 开源WPF控件库MaterialDesignInXAML推荐

    千次阅读 2019-12-02 07:10:00
    今天介绍一个开源的C# WPF开源控件库,非常漂亮,重点是开源哦WPF做桌面开发是很有优势的,除了微软自带的控件外,还有很多第三方的控件库,比如收费的Dev Express For WP...
  • .Net Core 3.1 WPF控件源码实例,集成常用控件,项目可以直接添加引用 软件截图:https://blog.csdn.net/ZhengShuiHuang/article/details/121383879
  • .Net Core WPF 控件库

    2021-11-17 17:44:18
    .Net Core 3.1 WPF控件库,包含常用基本控件,独立控件库,项目直接添加引用就可以。 下载地址: 1、TextBox效果,封装有常用输入模式等属性,可以设置输入文本、整数、数字,数字最大值、最小值等 2、...
  • [WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互 原文:[WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互1. 前言 WPF有一个灵活的UI框架,用户可以轻松地使用代码控制控件...
  • WPF 几种常用控件样式的总结

    千次阅读 2014-09-21 10:28:07
    这里把wpf中几种常用样式总结一下,后期可以直接拷贝使用,呵呵 一、Button View Code 二、ComboBox View Code 三、ContextMen View Code 四、DataGrid View Code 五、Label ...
  • 1. 目标 我实现了一个自定义控件库,并且打算用这个控件库作例子写一些...现阶段我的目标是实现一些简单的控件,由于我并不是打算重复造轮子,所以我会挑些Extended Wpf Toolkit没有的功能实现,之后再根据常用的...
  • 美了哭了,AduSkin是我见过最好看的WPF控件库

    万次阅读 多人点赞 2020-02-22 20:25:10
    文章通过dotnet9授权首发原创,一款简单漂亮的WPF UI,融合部分开源框架的组件
  • 后来探索了下wpf自带的控件,在系统自带组件上扩展一些常用功能。发现WPF其功能非常强大, Newbeecoder.UI 基于.net framework 4.0框架开发,很好的兼容更高版本。 只要你有好看的设计图,基本上都可以按设计图...
  • 9款WPF用户界面控件对比评测

    万次阅读 2016-12-13 10:15:51
    WPF(Windows Presentation Foundation)是微软推出的基于Vista的用户界面...由此,市面上各大知名第三方控件厂商均有专门针对WPF版本的用户界面控件,下面小编为你一一进行了盘点,并简单列出了各自的特点,希望能帮助
  • 由于本文略长,建议读者查看以下导航目录,根据读者个人关注点点击阅读,也可按住 Ctrl + F 组合键搜索常用控件名字进行搜索阅读,当然小编是希望读者都能按文章顺序阅读啦,哈哈。 下面是本文阅读目录导航: 一、...
  • WPF样式大全,20多套不同风格的样式,包含tabcontrol、datagrid、button、combobox、menu、Progressbar、expander、textbox等常用控件样式。
  • 使用各种 WPF Chart图表控件、插件的经历回顾与总结  --不愿透露姓名的客户提...
  • 一、目的:封装了一些控件到自定义的控件库中,方便快速开发 二、实现功能: 基本实现常用基础控件,满足常规软件快速开发 同时支持框架.Net Core 3.0 + ,.Net FrameWork4.5+ 三、整体概况 1、登录页面:...
  • 国内优秀的WPF开源控件库,Panuon.UI的优化版本。一个漂亮的、使用样式与附加属性的WPF UI控件库,值得向大家推荐使用与学习。 今天站长(Dotnet9,站长网址:https://dotnet9.com, 微信公众号:dotnet9_com)推荐另...
  • 虽然我认为这个控件库控件需要模仿Aero2的外观,但总有例外,其中一个就是ProgressRing。ProgressRing是来自UWP的控件,部分代码参考了 这里。ProgressRing的使用方式运行效果如下: <kino:ProgressRing Is...
  • WPF常用第三方控件

    2017-05-23 06:40:00
    NLog日志控件: Install-Package NLog.Config ...最新版本只支持.net 4.5.2及以上版本,.net 4.5.2以下版本安装6.9.11版本的: Install-Package MySql.Data -Version 6.9.11 SQLit...
  • WPF自定义控件 按钮 (一)

    千次阅读 2017-09-19 09:58:35
    从这里开始,记录WPF自定义控件的制作方法,相比制作传统winform的自定义控件来说,WPF自定义控件做起来更加优雅,效果也更好。 从最常用控件 Button 开始: 首先从MSDN上查看 Button 控件的默认样式和模板,...
  • 除了以外观为卖点的控件库WPF控件库都默认使用“素颜”的外观,然后再提供一些主题包。这样做的最大好处是可以和原生控件或其它控件库兼容,而且对于大部分人来说模仿原生的主题也比自己设计一套好看的UI容易得...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,587
精华内容 1,434
关键字:

wpf常用控件库