精华内容
下载资源
问答
  • WPF自定义控件
    2022-04-27 20:04:50

    通过学习,掌握一些重要的概念,帮助更好地理解WPF设计的模式,各种布局控件配合上内容控件,组合出我们想要的布局方式,在WPF中它提供了一个工具箱辅助我们理解学习控件,里面有我们需要的各种控件,鼠标点击长按工具箱某个控件,然后把它拖出到WPF的面板上,他就直接呈现在设计面板上了,除了它自带的控件外,我们为了丰富页面的元素,经常会使用到一些自定义控件,WPF控件可以通过数据模型DataTemplate、样式Style、控件模板ControlTemplate和触发器等机制减少创建新控件的需要,WPF还提供了三种用于创建控件的方法
    第一种是基于UserControl创建的控件,也是最简单的方法,基于UserControl类进行继承,此时我们可以将WPF中现有组件添加到UserControl画布上来,并将各个组件进行命名,这样可以在后台进行组件访问和使用事件处理程序。UserControl可以利用丰富的内容、样式和触发器的优点,但是继承UserControl的控件,将没有办法使用DataTemplate和ControlTemplate来自定义UI外观
    第二种是基于Control创建控件,他可以使用模板定义UI外观,而且可以将后台逻辑和前端样式进行分离,这种创建出来的自定义控件,支持使用命令和绑定来完成相关动作,实现类似于事件的效果,这种控件还可以重新定义ControlTemplate和DataTemplate来定义UI外观,还可以支持不同的主题
    第三种基于frameworkElement创建的控件,一般来说,使用前两种已经可以满足绝大部分页面的业务需求,基于基于frameworkElement创建的控件可以通过重写OnRender方法进行UI绘制,一方面,可以通过自定义元素组合形成组件更多的外观

    更多相关内容
  • 接触WPF也有两个多月了,有了一定的理论基础和项目经验,现在打算写一个系列,做出来一个WPF的控件...下面这篇文章主要给大家介绍了关于WPF自定义控件和样式之自定义按钮(Button)的相关资料,需要的朋友可以参考下。
  • wpf自定义控件库,包含列表,按钮,文本框,滚动条,进度条,消息窗体,气泡组件等多种自定义控件样式。
  • WPF 自定义控件(包含全部代码) 自定义按钮、自定义文本框、自定义组合框、自定义日期控件等等
  • 从国外开源网站上找到的效果非常好的WPF自定义控件。切换开关控件(WpfToggleSwitch)。
  • WPF 自定义控件

    2017-08-18 15:36:05
    自定义控件
  • VB.NET做的一个WPF的Demo,做了个控件。像是Windows图标一样.图片加文字,移动到图片上,图片会放大。这个demo也说明了如何建立一个自定义的属性,并把UserControl中的控件属性绑定到自己定义的属性中。
  • WPF 自定义控件样式

    2019-01-21 16:07:48
    自己写的一些WPF自定义控件样式,有TabControl,Button,ComboBox等,新手入门学习不错。
  • WPF自定义控件-旋钮

    2014-01-11 23:35:29
    可以旋转的Slider,自己做的望大家一起学习交流。
  • 显示对象或对象集合的属性的控件。 稳定的 数据网格 具有“ Excel感觉”的数据网格(请注意,控件未虚拟化) 稳定的 树形列表框 看起来和感觉都像TreeView ListBox (支持多选和拖放) 稳定的 颜色选择器 拾色器...
  • wpf自定义控件

    2020-12-12 19:02:29
    在学习wpf中,wpf中有许多已经定义好的控件供我们选择应用,当我需要定义一个带文字标识的输入框时,模板中自带的控件的默认下的效果,与我想要的有所差别,而解决这个问题在于自行定义模板中的样式,下面就以文本...

    在学习wpf中,wpf中有许多已经定义好的控件供我们选择应用,当我需要定义一个带文字标识的输入框时,模板中自带的控件的默认下的效果,与我想要的有所差别,而解决这个问题在于自行定义模板中的样式,下面就以文本输入框为例来进行说明。
    文本输入框一般使用跟来进行设定,当我需要设置一个文字标识,在文字标识后让用户进行输入时,通常设置一个textblock,跟一个textbox文本盒,在默认的grid布局下,同时放置一给textblock跟textbox,后者会将前者覆盖掉,从而导致textblock不可见。解决办法:通过设置布局设定,让这两个控件分离,或按指定的位置进行放置,不然,textblock控件设置为水平居中,字体大小设置为12,text文本值为默认下的显示值。
    在这里插入图片描述
    在页面布局完成后,放置textblock控件,默认下的控件样式与我想要的样式还有所不同,这里通过在资源字典中添加设置textbox的样式,设置成直线的输入线,自定义边框画刷为黑色,垂直居中,水平向左,给边框厚度设置值,由于设置成直线的状态这里只给下设为1.

    在这里插入图片描述
    同样的以相同的方式设置textblock控件的样式,对其边框厚度,水平,垂直方向进行设置。在这里插入图片描述
    经过设置后,textblock跟textbox的展示效果,便呈现出以下的样子,更直观更形象地展示各类输入框,选择框,时间选择等。

    效果如下图
    在这里插入图片描述
    总结:通过自定义控件样式实现我所想要的效果,为页面的的个性化提供更多的可能,让页面更灵活,功能更丰富。

    展开全文
  • WPF自定义美化控件,用于界面的美化。可直接在提供的源码基础上开发出属于自己的一套控件库,便于后续系统开发等
  • 一个自定义编写的WPF的Textbox文本框,带水印功能,错误信息显示,是否必填项。将常用的textbox需要的功能都包含了,一个控件解决texbox的问题.简单易用。如果有问题,可留言,我看见了尽量改正。
  • WPF自定义控件,UserControl的制作与使用过程,这个例子采用了详细而且简介的方式讲述了WPF自定义控件的制作及调用的全过程,他适合初学者没制作过又想使用WPF自定义控件的程序员。
  • wpf 自定义控件年月日,自由控制,可直接引用dll 里面注释掉的时分秒可以放开,根据项目需求自己修改。
  • WPF自定义Button控件

    2018-11-05 15:02:06
    实现Vista风格的一些控件,里边包含几种类型,详情可下载
  • WPF-自定义控件

    2017-05-18 18:24:40
    资源中包括自己写的控件和修改别人的集成到自己的控件。主要有:温度计控件、Win8转圈等待控件、车速仪表控件、微信圆球摆动控件、加载等待转圈控件等包括源码,欢迎下载
  • 摘要:C#源码,控件类库,treeview,combobox,自定义控件 C# wpf combobox带treeview的自定义控件示例源码,树控菜单和下拉框的自定义源码,希望对你有所帮助。 运行环境:Visual Studio2010
  • WPF控件可以通过数据模型(DataTemplate)、样式(Style)、控件模板(ControlTemplate)和触发器(Trigger)等机制减少创建新控件的需要。 但是,某些场景下,我们确实需要创建新的控件。此时,理解 WPF不同控件的创建...

    简介: 某些场景下,我们确实需要创建新的控件。此时,理解 WPF不同控件的创建方法就显得非常重要。 WPF 提供3个用于创建控件的方法,每个方法都提供不同的灵活度。

    WPF控件可以通过数据模型(DataTemplate)、样式(Style)、控件模板(ControlTemplate)和触发器(Trigger)等机制减少创建新控件的需要。 但是,某些场景下,我们确实需要创建新的控件。此时,理解 WPF不同控件的创建方法就显得非常重要。 WPF 提供3个用于创建控件的方法,每个方法都提供不同的灵活度,下面分别进行介绍。

    1 基于UserControl 创建

    创建控件最简单一个方法就是基于UserControl 类进行继承。此时,我们可以将WPF中现有组件添加到 UserControl 画布上来,并将各组件进行命名,这样可以在后台进行组件访问和使用事件处理程序。 UserControl 可以利用丰富内容、样式和触发器的优点。 但是,继承自 UserControl的控件,将无法使用 DataTemplate 或 ControlTemplate 来自定义UI外观。

    2  基于Control 创建

    基于Control类创建自定义控件的方法 ,可以使用模板定义UI外观。而且可以将后台逻辑和前端样式展现上进行分离。 另外,这种方法创建的自定义控件,还支持使用命令和绑定来完成相关动作,实现类似事件的效果。最后,控件可以重新定义ControlTemplate和DataTemplate来自定义UI外观。控件支持不同的主题。

    3 基于 FrameworkElement 创建

       一般来说,基于 UserControl 或 Control 创建的自定义控件即可完成业务需求,但是,在一些特殊情况下,简单的元素组合不能满足自定义控件的UI外观要求。此时,基于FrameworkElement 创建自定义控件是一个很好的选择。

    基于FrameworkElement创建控件,一方面可以通过重写的 OnRender 方法进行UI的直接绘制。 另一方面,可以通过自定义元素组合来可视化编写组件的外观。

    4 依赖属性

    WPF 可以通过设置控件的属性来更改其外观和行为。其中的依赖属性可以让自定义控件执行以下操作:

    • 在样式中设置该属性。
    • 将该属性绑定到数据源。
    • 使用动态资源作为该属性的值。
    • 对该属性进行动画处理。

    如果控件的属性支持以上任一功能,应将该属性实现为依赖属性。 下面给出一个微软官方文档的示例程序:

    /// <summary>
    /// Identifies the Value dependency property.
    /// </summary>
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register(
            "Value", typeof(decimal), typeof(NumericUpDown),
            new FrameworkPropertyMetadata(MinValue, new PropertyChangedCallback(OnValueChanged),
                                          new CoerceValueCallback(CoerceValue)));
    
    /// <summary>
    /// Gets or sets the value assigned to the control.
    /// </summary>
    public decimal Value
    {
        get { return (decimal)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
    
    private static object CoerceValue(DependencyObject element, object value)
    {
        decimal newValue = (decimal)value;
        NumericUpDown control = (NumericUpDown)element;
    
        newValue = Math.Max(MinValue, Math.Min(MaxValue, newValue));
    
        return newValue;
    }
    
    private static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        NumericUpDown control = (NumericUpDown)obj;         
    
        RoutedPropertyChangedEventArgs<decimal> e = new RoutedPropertyChangedEventArgs<decimal>(
            (decimal)args.OldValue, (decimal)args.NewValue, ValueChangedEvent);
        control.OnValueChanged(e);
    }
    

    此示例代码来自官网控件创作概述 - WPF .NET Framework | Microsoft Docs ,其中定义一个名为 ValueProperty的依赖属性(DependencyProperty ),通过调用DependencyProperty.Register向属性系统注册属性名称Value,其中包含了三个核心信息:

    • 属性的名称Value
    • 属性的类型decimal
    • 拥有属性的类型NumericUpDown
    • 属性元数据信息(FrameworkPropertyMetadata)

    其中,属性的元数据包含属性的默认值, CoerceValueCallback 和 PropertyChangedCallback 。 CoerceValue 确保 Value 大于或等于 MinValue 且小于或等于 MaxValue。另外,PropertyChangedCallback 回调方法为 OnValueChanged ,来处理属性值变化的相关逻辑,后面通过RoutedPropertyChangedEventArgs创建了一个路由事件,并通过control.OnValueChanged(e)来进行触发。

    原文链接
    本文为阿里云原创内容,未经允许不得转载。

    展开全文
  • 这个控件库主要目标是用于教学,希望通过这些博客初学者可以学会为自己或公司创建自定义控件,并且对WPF有更深入的了解。 控件库已放在Github上,并且也以发布到NuGet。 现阶段我的目标是实现一些简单的控件,由于...

    1. 目标

    我实现了一个自定义控件库,并且打算用这个控件库作例子写一些博客。这个控件库主要目标是用于教学,希望通过这些博客初学者可以学会为自己或公司创建自定义控件,并且对WPF有更深入的了解。

    控件库已放在Github上,并且也以发布到NuGet

    现阶段我的目标是实现一些简单的控件,由于我并不是打算重复造轮子,所以我会挑些Extended Wpf Toolkit没有的功能实现,之后再根据常用的UI模式慢慢增加各类控件和工具。(我一直在用Extended Wpf Toolkit,作为免费开源的控件库十分好用。)

    因为自己很少通过VisualStudio的Toolbox添加控件,所以暂时不考虑添加工具箱支持,如有需要可以参考这篇文章

    要创建一个自定义控件库只需要在VisualStudio中新建项目并选择“WPF 自定义控件库”,但创建一个项目还有很多琐碎的需要考虑的地方,这篇文章主要介绍创建一个控件库项目需要考虑的内容。

    2. 命名

    万事起头难,最难的就是命名,控件库的命名也烦恼了我很久。

    2.1 品牌名

    如果是公司的项目,直接用公司名+产品名的组合就可以,但个人的项目就要另外考虑品牌名了。

    品牌名有很多地方要考虑,例如不能使用带有贬义的名称。有涉及外观印象的词也要慎用,如Aqua,给人印象就是水的、蓝色的,如果以后要为控件库设计红色的主题就会很尴尬。诺基亚当年选择Lumia作为品牌连发音都有考虑到:

    “在1980年全球只有10,000左右的注册科技商标,而如今光在美国,就有超过30万这样的注册商标。”克里斯说道,为此候选名单也从最初的200个一下锐减到为数不多的几个幸存者身上。
    精通各地方言(84种语言)的语言学家们围绕这些为数不多的几个幸存者们开始工作,剔除其中某些会产生歧义的单词,并排除带有在某些国家很难发音的字母如J,LR和V,和在某些语言中不存在的字母(如在波兰语中没有的Q)的单词,以确保全球绝大多数国家和地区人民都能流畅的说出这一名称。

    虽然只是个控件库而已不需要考虑这么多,但容易发音还是很重要的,最后我选了“kino”,没什么意义,只是简短好读而已。

    2.2 程序集名称

    上面提到的Extended Wpf Toolkit,程序集的名称是Xceed.Wpf.Toolkit;而WindowsCommunityToolkit的程序集名称是Microsoft.Toolkit。对这些著名控件库来说名称和程序集的名称不一致带来的影响应该不大,但我还是倾向控件库的名称和程序集的名称一致比较好,毕竟知名度不高的情况下,或者公司内部项目多的情况下很容易产生混乱。

    《.NET设计规范:约定、惯用法与模式》这本书里提到:

    • 要用公司名称作为名字控件的前缀,这样可以避免与另一家公司使用相同的名字。
    • 要用稳定的、与版本无关的产品名称作为名字空间的第二层。

    那么参考Extended Wpf Toolkit的习惯,程序集的名称应该就是Kino.Wpf.Toolkit。考虑到如果以后可能还需要实现别的类库,如Kino.Uwp.Toolkit,而这两个控件库共同引用一个基础类库的话,那这个基础类库不管是叫Kino.Wpf还是Kino.Uwp都比较尴尬。所以最后还是决定Kino.Tookit.Wpf这样的顺序。

    复杂的控件,如DataGrid可以单独一个程序集(参考Microsoft.Toolkit.Uwp.UI.Controls.DataGrid),但我没打算做到这么复杂,目前一个程序集就够了。

    3. 目录结构

    我习惯为每一个(或每一组)控件单独建立一个目录,并且将各个控件的资源文件分开存放,再在Generic.xaml中合并它们。具体可以参考WindowsCommunityToolkit的做法:

    
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenu.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/HeaderedContentControl/HeaderedContentControl.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/HeaderedItemsControl/HeaderedItemsControl.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/RangeSelector/RangeSelector.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/ImageEx/ImageEx.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/ImageEx/RoundImageEx.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/HeaderedTextBlock/HeaderedTextBlock.xaml" />
            <ResourceDictionary Source="ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.xaml" />
            …     
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    
    

    其它:

    • Common目录,工具类放在这个目录;
    • Converters目录,实现IValueConverter接口的类都放在这个目录;
    • Assets及Assets/Images,存放图片等资源;

    4. 命名空间

    由于不打算把自定义控件库做得太复杂,目前所有控件都只使用Kino.Toolkit.Wpf这个命名空间。将来如果有一些高级特性或实验性质的控件,可以按照Wpf的惯例放在Kino.Toolkit.Wpf.Primitives里面。

    更进一步的,可以添加如下代码指定XAML中的命名空间:

    [assembly: XmlnsPrefix("https://github.com/DinoChan/Kino.Toolkit.Wpf", "kino")]
    [assembly: XmlnsDefinition("https://github.com/DinoChan/Kino.Toolkit.Wpf", "Kino.Toolkit.Wpf")]
    [assembly: XmlnsDefinition("https://github.com/DinoChan/Kino.Toolkit.Wpf", "Kino.Toolkit.Wpf.Primitives")]
    

    然后在XAML中可以这样引用:

    xmlns:kino="https://github.com/DinoChan/Kino.Toolkit.Wpf"
    

    这样做的好处是可以忽略真实的命名空间,便于以后修改命名空间或API升级。

    5. 版本号

    程序集的版本号格式如下:
    <主版本>.<次版本>.<生成号>.<修订版本>

    不过平时我都没用到“修订版本”,只使用前三个。

    Kino.Toolkit.Wpf则大致遵循语义化版本控制

    SemVer 的最基本方法是 3 组件格式 MAJOR.MINOR.PATCH,其中:

    • 进行不兼容的 API 更改时,MAJOR 将会增加
    • 以后向兼容方式添加功能时,MINOR 将会增加
    • 进行后向兼容 bug 修复时,PATCH 将会增加

    存在多处更改时,单个更改影响的最高级别元素会递增,并将随后的元素重置为零。 例如,当 MAJOR 递增时,MINORPATCH 将重置为零。 当 MINOR 递增时,PATCH 将重置为零,而 MAJOR 保持不变。

    有些人喜欢用日期作为版本号,如“2019.01.01”,这样也有它的好处,而且很多时候外部版本和内部版本不是一回事。

    6 .NET Framework版本

    如果只是为了自己或公司创建自定义控件库,当然是根据实际用到的.NET Framework版本选择自定义控件库的版本。就我目前情况来看,我选择了4.5。

    7. 代码规范

    基本上遵循《.NET设计规范:约定、惯用法与模式》及.Net Core的规范,并且使用FxCop及EditorConfig协助规范代码,参考WindowsCommunityToolkit的设定(但还是有些区别,例如花括号等;后来就越做越多区别)。一些移植过来的代码会使用SuppressMessage禁止显示警告。

    8. 实现原则

    我希望尽可能简单的实现一些控件,通过20%的代码解决80%的问题;我更倾向于介绍一种解决问题的思路,而不是提供一个包罗万象、面面俱到的成品。而且更复杂的问题通常都是业务上的需求,保持代码简单更方便其他人修改我的代码并灵活使用。

    由于ControlTemplate是很符合开放封闭原则的实现,所以能用ControlTemplate解决的自定义问题我都尽可能留给ControlTemplate解决,而不是通过添加大量属性。

    以我的经验来说,添加新功能很容易,移除旧功能会被人打,新功能的添加一定要谨慎。

    因为代码总是在WPF、Silverlight、UWP之间移植来移植去,所以我一直更倾向于使用兼容性较好的方案,例如如果使用VisualState的工作量和ControlTemplate.Triggers差不多我就会使用VisualState实现(不过通常ControlTemplate.Triggers都会简单很多)。

    不会添加在操作上有“独特创意”的控件。

    9. 结语

    Kino.Toolkit.Wpf的初衷毕竟是自己用及教学,没有通过充分的测试,如果发现严重的Bug请协助我修复。

    按道理所有控件应该都不会拒绝MVVM,不过Sample里面没有用到MVVM模式,如果发现对MVVM不够友好的部分请告知。

    示例代码没有使用MVVM模式,这是因为对控件的示例来说MVVM并不是那么直观,一般WPF的教材也都是使用CodeBehind的方式。

    最后提一句,对于太过复杂的控件,能让公司花钱买的就尽量花钱买。

    10. 引用

    Github
    NuGet

    展开全文
  • WPF控件可以通过数据模型(DataTemplate)、样式(Style)、控件模板(ControlTemplate)和触发器(Trigger)等机制减少创建新控件的需要。 但是,某些场景下,我们确实需要创建新的控件。此时,理解 WPF不同控件的创建...
  • WPF 中要写一个自己的控件,可以选择“用户控件”(派生自UserControl)或“自定义控件”(派生自Control类或其子类)。用户控件就像创建一个窗体或页面一样...这里写一个小例子,说明下WPF自定义控件的开发过程。 ...
  • 在listbox中添加checkbox成员并对checkbox进行动态绑定 xaml代码比较简单,只有一个listbox <ListBox x:Name="m_listBox" MaxHeight="300" Margin="0,2,0,0"> </ListBox> ... var check...
  • <Window x:Class="WpfApp03.TestWin04" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d=... x.
  • Generic.xaml中的UI代码: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ... xmlns:local="clr-namespace:WpfCustomControlLibrary1"> <Style Target.
  • 这篇文章的意义是,为wpf自定义控件,定义它的专属属性,这个属性不仅仅可以在c#中使用,也可以在xaml中使用,在xaml中赋值或者绑定。 在wpf开发过程中,总会用到格式各样的控件,但是原生控件远远不能满足实际...
  • WPF自定义控件

    2020-01-16 11:55:03
    WPF自定义控件集CustomControl动态库说明控件集(CustomComponent)常用控件样式视图集公共方法沟通与交流 CustomControl动态库说明 这是一个自定义控件和视图,还有控件样式和方法集合的动态库(CustomControl),...
  • wpf 环形进度条

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,083
精华内容 6,433
关键字:

wpf 自定义控件

友情链接: 文件分割.rar