精华内容
下载资源
问答
  • 主要包含以下要素: 1.WPF常用控件的重写 2.可以用来实现QQ音乐播放器界面 3.控件内事件的实现 4.毛玻璃效果 另外,该可以直接通过引用使用,有兴趣的同学可以下载学习
  • 这个控件库主要目标是用于教学,希望通过这些博客初学者可以学会为自己或公司创建自定义控件,并且对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 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的ScrollViewer WPF 控件库——可拖动选项卡的...

    WPF 控件库系列博文地址:

    WPF 控件库——仿制Chrome的ColorPicker

    WPF 控件库——仿制Windows10的进度条

    WPF 控件库——轮播控件

    WPF 控件库——带有惯性的ScrollViewer

    WPF 控件库——可拖动选项卡的TabControl

     

    一、先看看效果

     

    二、原理

    1、选项卡大小和位置

      这次给大家介绍的控件是比较常用的TabControl,网上常见的TabControl样式有很多,其中一部分也支持拖动选项卡,但是带动画效果的很少见。这也是有原因的,因为想要做一个不失原有功能,还需要添加动画效果的控件可不是一行代码的事。要做成上图中的效果,我们不能一蹴而就,最忌讳的是一上来就想实现所有效果。

      一开始,我们最好先用Blend看看原生的TabControl样式模板部分是如何实现的,这样我们也好有个参考。我们先从资产面板中拖一个TabControl放到窗体中,调整好合适的大小:

      然后在它上面右键,编辑模板->编辑副本->确定,在自动生成的xaml代码中关键部分是这里:

      可以看到,所有的选项卡(也就是TabItem)其实都是放在TabControl内部维护的一个TabPanel中,知道这些就够了,我们完全可以做一个定制的TabPanel来替换它: public class TabPanel : Panel 。既然这个TabPanel是一个容器,所以它必须负责计算TabItem的大小还要安排它的位置,我们可以重载父类Panel的 MeasureOverride 方法来处理这些逻辑: protected override Size MeasureOverride(Size constraint) 。在这个方法中我们通过 InternalChildren 这个只读属性来获取选项卡,选项卡的高度我们由 TabItemHeight 属性指定,由于TabPanel对用户是透明的,所以我们还要定制一个TabControl,里面加上 TabItemHeight 属性,让它和TabPanel的绑定。之后的 TabItemWidth 和 IsEnableTabFill 也同理。而选项卡的宽度则要分情况讨论了,如果 IsEnableTabFill = true 我们则要平分宽度,例如容器宽度为100,选项卡有10个,那么每个选项卡的宽度就是10。在这里要注意的是,选项卡的宽度最好不要有小数点,虽然有诸如 UseLayoutRounding 这种特性的帮助可以一定程度去除模糊,但在一个个连续排列的选项卡上反而会适得其反,你会发现两两之间的分割线宽度是不一致的,最好的办法就是“不公平的平分”,贴上一段代码来解释:

    public static int[] DivideInt2Arr(int num, int count)
    {
      var arr = new int[count];
      var div = num / count;
      var rest = num % count;
      for (int i = 0; i < count; i++)
      {
        arr[i] = div;
      }
      for (int i = 0; i < rest; i++)
      {
        arr[i] += 1;
      }
      return arr;
    }

      假设现在的容器宽度是108,选项卡还是10个,通过 MeasureOverride 方法处理后,前八个的宽度则是11,后两个是10。如果 IsEnableTabFill = false 则不要平分了,直接放入容器即可。

      现在选项卡大小搞定了,位置呢?太简单了,一个for循环不断叠加每个选项卡的宽度就可以了: size.Width += tabItem.ItemWidth; 。最后通过调用 Element.Arrange 即可排布选项卡的位置:

    var rect = new Rect
    {
        X = size.Width - tabItem.BorderThickness.Left,
        Width = itemWidth,
        Height = TabItemHeight
    };
    tabItem.Arrange(rect);

      因为选项卡左右都有边距,减去一个左边距,两者间的间隔就是一个边距了。

      选项卡大小和位置的逻辑处理大致是上述的过程,由于篇幅有限,加之我不喜欢一贴一大段代码,所以只挑重点来讨论,完整的代码还要考虑各种情况,这里就不再赘述了。

     

    2、动画处理

      这一部分我们的关注点就是鼠标了,对选项卡而言,鼠标按下、鼠标移动、鼠标抬起,这些我们都要关注,所以分别给它们订阅一下事件。与之对应的,我们还要给选项卡添加几个标私有字段,用以记录状态,比如 _isDragging 、 _isDragged 、 _dragPoint 、 _isWaiting ,前两个我就不说了,都是字面意思,第三个则用来暂存鼠标移动时的位置,每次进入选项卡的 OnMouseMove 事件,都要将 _isDragged 和其旧值作差,以求得当前选项卡应该移动的距离。 _isWaiting 用途比较特殊,在用户拖动选项卡时,我们最好等待一个粘滞距离,比如20个单位宽度,也就是说,在水平方向鼠标移动了超过20个像素无关单位后,选项卡才开始被拖动。

      在一开始的gif中可以看到,被拖动的选项卡改变位置时,其余的选项卡也会动态改变位置,那么位置改变的时机是如何确定的呢?很简单,只要将被拖动的选项卡到容器(TabPanel)左边界的这个距离除以 ItemWidth ,结果四舍五入就是这个选项卡当前应该所处的位置,紧接着下一步就是要把这个位置上的选项卡和当前被拖动的换个位置。此刻我们终于可以用动画来实现了,由于这个系列的文章多次讲过动画的代码了,所以就不再赘述。

      上面一段讲的是换位置,那么添加选项卡、删除选项卡呢?其实有个捷径可以走,就是使用 FluidMoveBehavior ,把他往样式里一塞,好了,效果出来了!

      但是这里有一个坑要注意, FluidMoveBehavior 虽然可以化简一部分动画逻辑,但是它有点越权了,它把你位置移动的逻辑也给做了,你会发现,如果不加处理,在你自己的动画结束后它还会再来一遍它的动画。可以将 FluidMoveBehavior 的 Duration 属性暂时归零来解决这个问题: FluidMoveDuration = new Duration(TimeSpan.FromSeconds(0)); 。

      这篇文章只是大致介绍一下实现的过程和思路,感兴趣的可以下载源码,多多交流,共同提高。

     

    三、源码

      本文所讨论的控件源码已经在github开源:https://github.com/NaBian/HandyControl

    转载于:https://www.cnblogs.com/nabian/p/9628078.html

    展开全文
  • 我常常看到同一个应用程序中的表单的按钮————也就是“确定”、“取消”那两个按钮————实现得千奇百怪,其实只要使用统一的Style起码就...喜欢更进一步将”确定“、”取消“或其它按钮封装进一个自定义控件里...

    1. 前言

    我常常看到同一个应用程序中的表单的按钮————也就是“确定”、“取消”那两个按钮————实现得千奇百怪,其实只要使用统一的Style起码就可以统一按钮的大小,而我喜欢更进一步将”确定“、”取消“或其它按钮封装进一个自定义控件里。

    这篇文章介绍了另一种ItemsControl的实现方式,并使用它为表单及自定义Window添加常用的按钮及其它功能。

    2. 为Form添加FunctionBar

    本来打算派生自ToolBar,或者参考UWP的CommandBar,但最后决定参考MahApps.Metro的WindowCommands创建了FormFunctionBar,它继承自HeaderedItemsControl,代码里没有任何功能,DefaultStyle如下:

    <Style TargetType="Button"
           x:Key="FormFunctionBarButtonBase">
        <Setter Property="MinWidth"
                Value="48" />
        <Setter Property="Margin"
                Value="4,0,0,0" />
        <Style.Triggers>
            <Trigger Property="IsDefault"
                     Value="true">
                <Setter Property="MinWidth"
                        Value="96" />
            </Trigger>
        </Style.Triggers>
    </Style>
    
    <Style x:Key="FormFunctionBarExtendedButton"
           TargetType="local:ExtendedButton"
           BasedOn="{StaticResource FormFunctionBarButtonBase}" />
    
    
    <Style x:Key="FormFunctionBarButton"
           TargetType="Button"
           BasedOn="{StaticResource FormFunctionBarButtonBase}" />
    
    
    
    <Style TargetType="{x:Type local:FormFunctionBar}">
        <Setter Property="FocusVisualStyle"
                Value="{x:Null}" />
        <Setter Property="Focusable"
                Value="False" />
        <Setter Property="IsTabStop"
                Value="False" />
        <Setter Property="Margin"
                Value="0" />
        <Setter Property="Padding"
                Value="12,0,12,12" />
        <Setter Property="HorizontalContentAlignment"
                Value="Right" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:FormFunctionBar">
                    <ControlTemplate.Resources>
                        <Style BasedOn="{StaticResource FormFunctionBarButton}"
                               TargetType="{x:Type Button}" />
                        <Style BasedOn="{StaticResource FormFunctionBarExtendedButton}"
                               TargetType="{x:Type local:ExtendedButton}" />
                    </ControlTemplate.Resources>
                    <Grid Margin="{TemplateBinding Padding}">
                        <ContentPresenter Content="{TemplateBinding Header}"
                                          ContentTemplate="{TemplateBinding HeaderTemplate}"
                                          HorizontalAlignment="Left" />
                        <ItemsPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                        Grid.Column="1" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
    

    这是ItemsControl的另一种实现方式,放进FormFunctionBar的Button及KinoButton都会自动应用DefaultStyle预设的样式。然后在Form中添加FunctionBar属性,并在控件底部放一个PlaceHolder:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <local:PageTitle Content="{TemplateBinding Header}"
                             ContentTemplate="{TemplateBinding HeaderTemplate}" />
        <local:ExtendedScrollViewer Grid.Row="1"
                                Padding="{TemplateBinding Padding}">
            <ItemsPresenter SnapsToDevicePixels="True"
                            UseLayoutRounding="True" />
        </local:ExtendedScrollViewer>
        <ContentPresenter Content="{TemplateBinding FunctionBar}"
                          Grid.Row="2" />
    </Grid>
    

    最终FormFunctionBar的使用方式如下:

    <kino:Form>
        <kino:Form.FunctionBar>
            <kino:FormFunctionBar>
                <Button Content="OK"
                        Click="OnOK"
                        IsDefault="True" />
                <Button Content="Cancel"
                        IsCancel="True"
                        Click="OnCancel" />
            </kino:FormFunctionBar>
        </kino:Form.FunctionBar>
    </kino:Form>
    
    

    这样做可以统一所有Form的按钮。由于做得很简单,后期可以再按需要添加其他控件的样式。其实这种方式很像Toolbar,我本来也考虑从Toolbar派生FunctionBar,但考虑到Toolbar本身的功能不少,而我只想要实现最简单的功能,所以直接从HeaderedItemsControl派生。(我将这个控件库定位为入门教材,所以越简单越好。)

    有必要的话可以设置IsDefaultIsCancel属性,前者表示按钮会在表单点击Enter时触发,后者表示按钮会在表单点击ESC时触发。在FormFunctionBar我通过Trigger设置了IsDefault=True的按钮比其它按钮更长。

    3. 为自定义Window添加按钮

    为自定义Window在标题栏添加一些按钮也是个常见的需求,原理和FormFunctionBar一样,只需要在自定义的Window的适当位置放置一个PlaceHolder,然后把WindowFunctionBar放进去,使用方式如下:

    <kino:ExtendedWindow.FunctionBar>
        <kino:WindowFunctionBar>
            <Button Content="Dino.C" />
            <Separator />
            <Menu>
                <MenuItem Header="发送反馈">
                    <MenuItem Header="报告问题"
                              IsCheckable="True" />
                    <MenuItem Header="提供反馈"
                              IsCheckable="True" />
                    <Separator />
                    <MenuItem Header="设置..." />
                </MenuItem>
            </Menu>
            <Button ToolTip="Help">
                <Grid UseLayoutRounding="True">
                    <Path  Data="some data"
                           Width="12"
                           Height="12"
                           UseLayoutRounding="True"
                           VerticalAlignment="Center"
                           HorizontalAlignment="Center"
                           Fill="White" />
                </Grid>
            </Button>
        </kino:WindowFunctionBar>
    </kino:ExtendedWindow.FunctionBar>
    

    WindowFunctionBar的DefaultStyle和FormFunctionBar大同小异,只是多了一些常用控件(如Menu、Separator)的样式,这里不一一展示。

    4. 结语

    FunctionBar展示了另一种自定义控件的方式:它本身基本上没有功能,只是方便添加Items并为为Items套用Style。如果派生自Toolbar的话可以使用OverflowItems功能,这很有趣,但现在还用不到所以没做。将来把FunctionBar添加到ListBoxItem之类的地方可能会需要。

    有必要的话还可以添加多个FunctionBar,如Window上可以添加LeftWindowCommands、RightWindowCommands等各个功能区域,我工作上没遇到这种需求为求简单就只添加了一个功能区。

    其实实现FunctionBar最大的难题是命名,我在CommandBar、ActionBar、Toolbar、ButtonsBar等名称之间由于了很久,根据反馈也许还是会修改。

    5. 参考

    MahApps.Metro_WindowCommands.cs at master

    Button.IsDefault Property (System.Windows.Controls) Microsoft Docs

    Button.IsCancel Property (System.Windows.Controls) Microsoft Docs

    6. 源码

    Kino.Toolkit.Wpf_FunctionBar at master

    展开全文
  • WPF自定义控件

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

    CustomControl动态库说明

    这是一个自定义控件和视图,还有控件样式和方法集合的动态库(CustomControl),CustomComponent文件为控件集合,CustomView文件为视图集合,ExposedMethod为暴露公共方法集合,Resource文件为资源文件,CodeSnippet为VS快捷键文件,notepad.txt为CustomControl动态库的属性及方法介绍.
    github地址:https://github.com/chancezheng/CustomControl.git

    控件集(CustomComponent)

    CustomComboBox、CustomPasswordBox、CustomPopupEx、CustomProgressBar、CustomSlider、
    CustomTextControl、ImageButton、MediaPlayerView、QRCodeControl、SwitchControl、

    常用控件样式(Resource)

    在资源字典中加入代码

    <ResourceDictionary Source="/CustomControl;component/Resource/Dictionary/ControlDictionary.xaml"/>
    

    即可调用样式,

    视图集(CustomView)

    1.引入customcontrol.ll后,调用MessageDialog.Show(),该方法目前有2个重载方法,可更换图标
    2.MediaPlayerView为视图组件,可结合自身需求使用,加入功能

    公共方法(ExposedMethod)

    1.GetPathHelper *[路径方法]
    2.ImageBitmapConverter *[Image与Bitmap之间的相互转换]
    3.TextValidationRule *[文本输入规则]
    4.TimerClock *[时钟定义]
    5.ValueConverter *[自定义逻辑绑定]:

    动态库使用说明文档

    nodepad.txt

    沟通与交流

    后面在不断更新WPF中的应用组件,往持续关注github中的项目更新,有任何问题可以QQ邮箱交流
    1733318151@qq.com或github:https://github.com/chancezheng谢谢大家

    展开全文
  • 一、目的:封装了一些控件到自定义的控件库中,方便快速开发 二、实现功能: 基本实现常用基础控件,满足常规软件快速开发 同时支持框架.Net Core 3.0 + ,.Net FrameWork4.5+ 三、整体概况 1、登录页面:...
  • 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-08-06 23:02:29
    控件常用控件   这里我就忽略xaml语法了,有不懂的,都可以看相关的书籍和文档。 其实wpf的所有基础控件都在工具箱里面,经常使用的控件都能以拖拽式创建。 常用的主要有: 1.布局控件,Grid,DockPanel...
  • wpf中使用ocx控件

    2013-04-07 22:57:00
    wpf中使用ocx控件 最近需要包装产品,需要将系统的界面进行一下改造,也...最近在网上查找了很多方法,换肤现在比较常用,不过发现基于WPF来实现更好,再怎么说也是微软下一代的所支持的界面。 ...
  • 我想快速给WPF程序添加托盘菜单1 简单要求:使用开源控件库在XAML中声明托盘菜单,就像给控件添加ContextMenu一样封装了常用命令,比如:打开主窗体、退出应用程序等我在TerminalMACS中添加了托盘菜单,最终实现的...
  • 一个软件,不可能只有一个文档界面,会有多个甚至几十二,比如一些浏览器、文档查看等都是多个标签页的形式,在C#中开源的可停靠管理的常用的是Xceed.Wpf.AvalonDock;但是用C/C++开发的开源停靠管理是没找到,没...
  • WPF 的开源项目有哪些

    千次阅读 2014-12-12 15:44:43
    Modern UI for WPF :http://mui.codeplex.com/ 利用Wpf...wpf toolkit :http://wpftoolkit.codeplex.com/ WPF常用的官方开源控件库 MVVM light toolkit : http://mvvmlight.codeplex.com/ 一个实现Mvvm模式的轻
  • 这是一个漂亮的、使用样式与附加属性的WPF UI控件库。基本常用的控件已经都可以正常使用,本人已经在项目中实际应用了。之前的Panuon.UI也有用过,后来的项目就用Panuon.UI.Silver。非常感谢末城via 附上GitH...
  • 使用开源控件库 在XAML中声明托盘菜单,就像给控件添加ContextMenu一样 封装了常用命令,比如:打开主窗体、退出应用程序等 我在TerminalMACS中添加了托盘菜单,最终实现的托盘菜单效果: 2 如何做? 【Step 1】...
  • Arthas和LiveCharts分别是WPF的第三方常用控件库和统计图表库,用起来很好看,也很方便
  • asp.net知识

    2015-06-18 08:45:45
    获取數据表的前N条记录 几段SQL Server语句和存储过程 生成表中的数据的脚本 最详细的SQL注入相关的命令整理 Oracle Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle编程的编码规范及命名规则 Oracle...
  • 树形图的比较

    2019-05-16 20:34:23
    开发工具与关键技术:Visual Studio 作者:杨春桃 撰写时间:2019年05月18日 MVC: MVC树形图实现需要环境:bootstrap.css叠层样式、jquery-...常用WPF控件</a> <a href="#" id="dianjishouqi"...
  • 两种方式获取revit族文件预览缩略图

    千次阅读 2019-09-19 23:14:40
    想做一个族管理插件,其中有一个功能是预览其缩略图. 解决方案1 revit api中有一个ElementType.GetPreviewImage方法,ElementType的常用子类就是familySymbol 需要注意的是GetPreviewImage返回的是一个Bitmap,在...
  • 4.6.3 常用的名称空间 237 4.6.4 导入名称空间并指定别名 239 4.6.5 为名称空间指定别名 240 4.6.6 在asp.net中引用名称空间 241 4.7 创建自己的名称空间 241 4.8 my关键字 244 4.8.1 my....
  • 4.6.3 常用的名称空间 237 4.6.4 导入名称空间并指定别名 239 4.6.5 为名称空间指定别名 240 4.6.6 在asp.net中引用名称空间 241 4.7 创建自己的名称空间 241 4.8 my关键字 244 4.8.1 my.application...
  • 内包含ComponentOne Ultimate、ComponentOne Studio Enterprise、ComponentOne Studio for Windows Forms、ComponentOne Studio for ASP.NET ...、ComponentOne Studio for WPF、ComponentOne Studio for WinRT XAML...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

wpf常用控件库