精华内容
下载资源
问答
  • 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 自定义控件(包含全部代码) 自定义按钮、自定义文本框、自定义组合框、自定义日期控件等等
  • 接触WPF也有两个多月了,有了一定的理论基础和项目经验,现在打算写一个系列,做出来一个WPF的控件...下面这篇文章主要给大家介绍了关于WPF自定义控件和样式之自定义按钮(Button)的相关资料,需要的朋友可以参考下。
  • 自定义日期控件,选择日期的同时,显示当前的时间,时间的格式可自定义,可显示时分秒、上午/下午、星期等,可自定义显示格式。对Datepicker的重写,其中有一个类,可以复制到自己的项目,也可以输出为dll控件,这是...
  • 主要包含以下要素: 1.WPF常用控件的重写 2.可以用来实现QQ音乐播放器界面 3.控件内事件的实现 4.毛玻璃效果 另外,该可以直接通过引用使用,有兴趣的同学可以下载学习
  • WPF自定义控件库

    千次阅读 2018-07-10 12:48:21
    物尽其用,今天跟大家分享一下自己写的一个WPF控件库。大家可以看以下几张图片效果,都是可以实现的(歌曲列表等少部分不在此库中)。基本控件实现的方式可以看代码,如果有问题可以评论留言,互相交流。1. 音乐...

           2018年,为了大学能够顺利毕业,自己仿照QQ音乐做了一套包含Windows桌面客户端与Web后台管理的系统。物尽其用,今天跟大家分享一下自己写的一个WPF控件库。

           大家可以看以下几张图片效果,都是可以实现的(歌曲列表等少部分不在此库中)。基本控件实现的方式可以看代码,如果有问题可以评论留言,互相交流。

    1. 音乐播放器主界面

    2. 搜索框

    3. 皮肤管理


    有兴趣的同学可以下载源代码,交流学习。

    https://download.csdn.net/download/qq_31606375/10532332

    展开全文
  • 一个自定义编写的WPF的Textbox文本框,带水印功能,错误信息显示,是否必填项。将常用的textbox需要的功能都包含了,一个控件解决texbox的问题.简单易用。如果有问题,可留言,我看见了尽量改正。
  • WPF 自定义控件

    2017-08-18 15:36:05
    自定义控件
  • WPF-自定义控件

    2017-05-18 18:24:40
    资源中包括自己写的控件和修改别人的集成到自己的控件。主要有:温度计控件、Win8转圈等待控件、车速仪表控件、微信圆球摆动控件、加载等待转圈控件等包括源码,欢迎下载
  • 我实现了一个自定义控件库,并且打算用这个控件库作例子写一些博客。这个控件库主要目标是用于教学,希望通过这些博客初学者可以学会为自己或公司创建自定义控件,并且对WPF有更深入的了解。 控件库已放在Github上,...

    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

    展开全文
  • VB.NET做的一个WPF的Demo,做了个控件。像是Windows图标一样.图片加文字,移动到图片上,图片会放大。这个demo也说明了如何建立一个自定义的属性,并把UserControl中的控件属性绑定到自己定义的属性中。
  • 从国外开源网站上找到的效果非常好的WPF自定义控件。切换开关控件(WpfToggleSwitch)。
  • 1. 前言 对WPF来说ContentControl和ItemsControl是...大部分时候我们并不需要自定义ItemsControl,因为WPF提供了一大堆ItemsControl的派生类:HeaderedItemsControl、TreeView、Menu、StatusBar、ListBox、ListView...

    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

    展开全文
  • WPF .net Framework 4.6.2 虚拟键盘自定义控件;适合新手借鉴、程序应急使用;直接上源码,可自行修改; 虚拟键盘(支持英文,数字输入,及部分特殊字符(特殊字符都为英文字符)) 1.0版本;后续慢慢增加其他功能及其他...
  • wpf自定义控件

    2020-12-12 19:02:29
    在学习wpf中,wpf中有许多已经定义好的控件供我们选择应用,当我需要定义一个带文字标识的输入框时,模板中自带的控件的默认下的效果,与我想要的有所差别,而解决这个问题在于自行定义模板中的样式,下面就以文本...
  • wpf控件库重写所有基础控件(按钮、表格、滚动条等美化),非常漂亮
  • WPF自定义时间控件,可选择日期、时间
  • WPF 自定义控件样式

    2019-01-21 16:07:48
    自己写的一些WPF自定义控件样式,有TabControl,Button,ComboBox等,新手入门学习不错。
  • WPF 使用自定义控件库CustomControl实现控件在其他项目使用介绍操作流程使用VS2019创建自定义用户控件库在创建的自定义控件项目中添加你的代码生成解决方案并添加到其他WPF项目中 介绍 本文的目的旨在记录在WPF项目...
  • 工程项目中进度条的使用多种多样,该案例实现自定义控件的环形进度条,控件的各项数值可绑定使用,案例提供一种动态切换样式的方式
  • WPF自定义控件,UserControl的制作与使用过程,这个例子采用了详细而且简介的方式讲述了WPF自定义控件的制作及调用的全过程,他适合初学者没制作过又想使用WPF自定义控件的程序员。
  • wpf 用户控件 按钮.如果你不会用,我无法可说
  • 摘要:C#源码,控件类库,treeview,combobox,自定义控件 C# wpf combobox带treeview的自定义控件示例源码,树控菜单和下拉框的自定义源码,希望对你有所帮助。 运行环境:Visual Studio2010
  • 自定义控件定义自定义属性 public class CustomDetails : Control { static CustomDetails() { DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomDetails), new FrameworkPropertyMetadata(typeof...
  • WPF自定义按钮,增加圆角样式功能!1.创建控件库项目2.控件.cs文件中添加边框圆角属性调用按键资源文件编辑MyButton.xaml文件,设置样式vs默认的样式请参考:添加颜色资源设置默认样式绑定边框样式数据完整MyButton....
  • WPF 自定义控件创建及使用教程

    千次阅读 2020-02-02 22:11:53
    1、WPF自定义控件的创建 自定义控件比较灵活,按照教程学习比较简单 步骤一:新建WPF应用并添加WPF自定义控件,添加后会有Themes文件夹和customControl的cs 文件 2、按照cs文件中的步骤使用自定义控件 这...
  • 检查可用于缩放和平移其内容的自定义内容控件

空空如也

空空如也

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

wpf自定义控件库