精华内容
下载资源
问答
  • WPF 自定义控件创建及使用教程

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

    1、WPF自定义控件的创建

    自定义控件比较灵活,按照教程学习比较简单

    步骤一:新建WPF应用并添加WPF自定义控件,添加后会有Themes文件夹和customControl的cs 文件

     

    2、按照cs文件中的步骤使用自定义控件

    这就是最简单的自定义控件,调试后发现什么都没有

    第二部分,修改自定义控件中的内容

    如果要控件中有内容,则必须修改Generic中的内容,例如增加一个textbox和button

    可以修改自定义控件的属性

     

     

    第三部分,其他项目怎么使用自定义控件

    和当前项目中相当只是需要添加项目的引用,可以把自定义控件的exe改为dll,因为assembly中没有定义后缀

     

    第四部分WPF自定义控件的模板样式设置

    可以通过generic.xaml的template 设置自定义控件的样式

     

    最后,WPF自定义控件的公开属性

    第一步:

     

    第二步:

     

    第三步:

     

    展开全文
  • WPF自定义控件(四)の自定义控件 原文:WPF自定义控件(四)の自定义控件在实际工作中,WPF提供的控件并不能完全满足不同的设计需求。这时,需要我们设计自定义控件。 这里LZ总结一些自己的思路,...
    原文: WPF自定义控件(四)の自定义控件

    在实际工作中,WPF提供的控件并不能完全满足不同的设计需求。这时,需要我们设计自定义控件。

    这里LZ总结一些自己的思路,特性如下:

    • Coupling
    • UITemplate
    • Behaviour
    • Function Package

    下面举例说说在项目中我们经常用到调音台音量条,写一个自定义控件模拟调音台音量条。

    自定义控件SingnalLight,实现功能

    • 接收来自外部的范围0~100的数值
    • 实时显示接收数值
    • 数值范围0~50显示绿色,50~85显示黄色,85~100显示红色,没有数值显示褐色
    • 可在父控件上拖拽该控件

     

    public class SingnalLight : ContentControl {
            public int ValueA {
                get { return (int)GetValue(ValueAProperty); }
                set { SetValue(ValueAProperty, value); }
            }
        
    
            public SingnalLight() {
                this.AllowDrop = true;
            }
    
    
            static SingnalLight() {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(SingnalLight), new FrameworkPropertyMetadata(typeof(SingnalLight)));
            }
    
    
        }

    ValueA为接受外部数值的属性

    2.复写控件UITemplate

     1  <Style TargetType="{x:Type control:SingnalLight}">
     2         <Setter Property="RenderTransform">
     3             <Setter.Value>
     4                 <TranslateTransform X="{Binding Path=X,RelativeSource={RelativeSource AncestorType={x:Type control:SingnalLight}}}"
     5                                     Y="{Binding Path=Y,RelativeSource={RelativeSource AncestorType={x:Type control:SingnalLight}}}"/>
     6             </Setter.Value>
     7         </Setter>
     8         <Setter Property="Template">
     9             <Setter.Value>
    10                 <ControlTemplate>
    11                     <ControlTemplate.Resources>
    12                         <control:SingnalLightStatusConverter x:Key="colorconverter"></control:SingnalLightStatusConverter>
    13                         <control:SingnalLightValueConverter x:Key="valueconverter"></control:SingnalLightValueConverter>
    14                     </ControlTemplate.Resources>
    15                     <StackPanel>
    16                         <TextBlock Text="{Binding Path=ValueA,RelativeSource={RelativeSource AncestorType={x:Type control:SingnalLight}}}"></TextBlock>
    17                         <TextBlock Text="100"></TextBlock>
    18                         <Border   
    19                             x:Name="bd1"
    20                             Height="{Binding Path=LightHeight,RelativeSource={RelativeSource AncestorType={x:Type control:SingnalLight}}}"
    21                             SnapsToDevicePixels="True"
    22                             BorderBrush="Black" BorderThickness="1" Background="Transparent">
    23                             <Rectangle Fill="{Binding Path=ValueA,
    24                                                       RelativeSource={RelativeSource AncestorType={x:Type control:SingnalLight}},
    25                                                       Converter={StaticResource ResourceKey=colorconverter}}" 
    26                                        VerticalAlignment="Bottom">
    27                                 <Rectangle.Height>
    28                                     <MultiBinding Converter="{StaticResource ResourceKey=valueconverter}">
    29                                         <Binding Path="ValueA" RelativeSource="{RelativeSource AncestorType={x:Type control:SingnalLight}}"></Binding>
    30                                         <Binding Path="Height" ElementName="bd1"></Binding>
    31                                     </MultiBinding>
    32                                 </Rectangle.Height>
    33                             </Rectangle>
    34                         </Border>
    35                         <TextBlock Text="0"></TextBlock>
    36                     </StackPanel>
    37                 </ControlTemplate>
    38             </Setter.Value>
    39         </Setter>
    40     </Style>

     

    3.接受值判断,SingnalLight通过实现IValueConverter和Override Arrange & Measure Methods,实现了UI呈现的绑定,

     1     public class SingnalLightStatusConverter : IValueConverter {
     2         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
     3             SolidColorBrush result = Brushes.Transparent;
     4             if (value.GetType() == typeof(int)) {
     5                 var color = System.Convert.ToInt32(value);
     6                 if (color < 50) result = Brushes.Green;
     7                 else if (color < 85 && color >= 50) result = Brushes.Yellow;
     8                 else if (color <= 100 && color >= 85) result = Brushes.Red;
     9                 else result = Brushes.Gray;
    10             }
    11             return result;
    12         }
    13 
    14         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
    15             throw new NotImplementedException();
    16         }
    17     }
    18 
    19     public class SingnalLightValueConverter : IMultiValueConverter {
    20         public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
    21             double result = 0;
    22             if (values[0].GetType() == typeof(int) && values[1].GetType() == typeof(double)) {
    23                 result = (double)values[1] / 100 * System.Convert.ToDouble(values[0]);
    24             }
    25             return result;
    26         }
    27 
    28         public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) {
    29             throw new NotImplementedException();
    30         }
    31     }
     
     
    1         protected override Size MeasureOverride(Size constraint) {
    2             if (ActualHeight > 0) LightHeight = ActualHeight * .7;
    3             return base.MeasureOverride(constraint);
    4         }
    5 
    6         protected override Size ArrangeOverride(Size arrangeBounds) {
    7             return base.ArrangeOverride(arrangeBounds);
    8         }
     


    4.控件支持拖拽,覆写MouseDown,MouseMove,MouseUp方法。这样写的好处是,如果在父控件的事件中实现Drag,父控件如果有多个对象,这样逻辑会十分混乱。

     
     1         protected override void OnMouseMove(MouseEventArgs e) {
     2             base.OnMouseMove(e);
     3             if (e.LeftButton == MouseButtonState.Pressed) {
     4                 _currentPoint = e.GetPosition(this);
     5                 X += _currentPoint.X - _startPoint.X;
     6                 Y += _currentPoint.Y - _startPoint.Y;
     7             }
     8         }
     9 
    10         protected override void OnMouseDown(MouseButtonEventArgs e) {
    11             base.OnMouseDown(e);
    12             _startPoint = e.GetPosition(this);
    13             this.CaptureMouse();
    14         }
    15 
    16         protected override void OnMouseUp(MouseButtonEventArgs e) {
    17             base.OnMouseUp(e);
    18             this.ReleaseMouseCapture();
    19         }
     

     

     

    自定义控件系列博文链接:

    WPF自定义控件(一)の控件分类 
    WPF自定义控件(二)の重写原生控件样式模板
    WPF自定义控件(三)の扩展控件 
    WPF自定义控件(四)の自定义控件
    WPF自定义控件(五)の用户控件

    posted on 2018-11-11 13:12 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9941830.html

    展开全文
  • WPF 自定义控件样式

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

    2021-04-08 06:22:24
    WPF自定义控件创建 本文简单的介绍一下WPF自定义控件的开发。 首先,我们打开VisualStudio创建一个WPF自定义控件库,如下图: 然后,我们可以看到创建的解决方案如下: 在解决方案中,我们看到了一个Themes文件夹...

    WPF自定义控件创建

    本文简单的介绍一下WPF自定义控件的开发。

    首先,我们打开VisualStudio创建一个WPF自定义控件库,如下图:

    然后,我们可以看到创建的解决方案如下:

    在解决方案中,我们看到了一个Themes文件夹和一个CS文件。

    其中CS文件,就是我们需要编写的自定义控件,里面的类继承了Control类;而Themes则存放该控件的样式。即,WPF自定义控件,是通过样式给我们的编辑的控件类披上外衣而形成的。

    下面,我们来编写一个简单的时间控件。

    我们先将CustomControl1文件改名为KibaDateTime,然后打开KibaDateTime.cs文件,看到了一些控件应用提示,这些提示写的是自定义控件的应用方式,我们先不看这些提示,因为他写的不是很好理解。

    接下来我们开始编写时间控件,修改KibaDateTime类如下:

    public class KibaDateTime : TextBox
        {
            private static Regex regex = new Regex("[0-9]+");
            #region 小时
            public static readonly DependencyProperty HourProperty = DependencyProperty.Register(
                 "Hour", typeof(int), typeof(KibaDateTime), new FrameworkPropertyMetadata(00));
           
            public int Hour
            {
                get
                {
                    return (int)GetValue(HourProperty);
                }
                set
                {
                    SetValue(HourProperty, value);
                }
            } 
            #endregion
            #region 分钟
            public static readonly DependencyProperty MinuteProperty = DependencyProperty.Register(
                 "Minute", typeof(int), typeof(KibaDateTime), new FrameworkPropertyMetadata(00));
            
            public int Minute
            {
                get
                {
                    return (int)GetValue(MinuteProperty);
                }
                set
                {
                    SetValue(MinuteProperty, value);
                }
            }
            #endregion
            #region 秒
            public static readonly DependencyProperty SecondProperty = DependencyProperty.Register(
                 "Second", typeof(int), typeof(KibaDateTime), new FrameworkPropertyMetadata(00)); 
            public int Second
            {
                get
                {
                    return (int)GetValue(SecondProperty);
                }
                set
                {
                    SetValue(SecondProperty, value);
                }
            }
            #endregion
            static KibaDateTime()
            {
                //当此依赖项属性位于指定类型的实例上时为其指定替换元数据,以在该依赖项属性继承自基类型时重写该属性已存在的元数据。
                DefaultStyleKeyProperty.OverrideMetadata(typeof(KibaDateTime), new FrameworkPropertyMetadata(typeof(KibaDateTime))); 
            }
        }
    
    

    如上述代码所示,我们修改了KibaDateTime继承的类;将Control改为了TextBox。

    这样,我们就可以在KibaDateTime控件的样式中,用使用TextBox的属性,进行绑定了。

    然后,我们在控件类里定义三个依赖属性,小时、分钟、秒;之后,我们会把这个三个属性,绑定到样式中。

    现在我们打开Theme文件下的Generic.xaml文件,看到样式代码如下:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:KibaCustomControl">
        <Style TargetType="{x:Type local:KibaDateTime}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:KibaDateTime}">
                        <Border Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                            
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style> 
    </ResourceDictionary>
    
    

    从代码中可以看到,系统已经为我们定义好了KibaDateTime控件的外壳样式。

    我们需要做的就是将样式内容添加进去。

    我们在Border中,添加TextBox,然后进行小时、分钟、秒的绑定,这里要用Binding来绑定。

    添加的TextBox代码如下,我们进行了一些简单宽高和间距设置。

    <TextBox Text="{Binding Hour,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Width="24" Height="24" Padding="2,3,0,0" FontSize="12" ></TextBox>
    <TextBox Text="{Binding Minute,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Width="24" Height="24" Padding="2,3,0,0" FontSize="12" ></TextBox>
    <TextBox Text="{Binding Second,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Width="24" Height="24" Padding="2,3,0,0" FontSize="12" ></TextBox>
    
    

    上述代码使用了【RelativeSource={RelativeSource TemplatedParent}】来寻找绑定源,注意,这里一定要用TemplatedParent,不然无法绑定到我们控件类。

    自定义控件到此为止,就已经定义好了。然后我们使用下刚刚定义好的控件。

    WPF自定义控件应用

    首先创建一个WPF项目,然后引用KibaCustomControl这个程序集。如下图:

    然后,在MainWindow.xaml页面中,使用该控件。

    修改MainWindow.xaml页面代码如下:

    <Window x:Class="KibaTestControl.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:c="clr-namespace:KibaCustomControl;assembly=KibaCustomControl"
            xmlns:local="clr-namespace:KibaTestControl"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <DockPanel>
            <StackPanel VerticalAlignment="Top" Margin="10" Orientation="Horizontal">
                <c:KibaDateTime Name="dtHour"></c:KibaDateTime> 
                <Button Content="查看时间" Click="Button_Click" Width="75"/>
            </StackPanel>
        </DockPanel>
    </Window>
    
    

    其中【xmlns:c="clr-namespace:KibaCustomControl;assembly=KibaCustomControl"】这句话是将我们自定义的程序集内的控件,引入到当前页。

    【<c:KibaDateTime Text="00" ></c:KibaDateTime>】这句话就是我们自定义控件的应用了。

    应用界面如下图所示:

    其中查看时间的事件代码如下:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("小时:"+dtHour.Hour+":"+dtHour.Minute + ":" + dtHour.Second);
    }
    

    修改时间,点击查看时间,得到结果如下:

    到此,这个简单的WPF控件,就开发完了。

    ----------------------------------------------------------------------------------------------------

    代码已经传到Github上了,欢迎大家下载。

    Github地址:https://github.com/kiba518/KibaWpfCustomControl

    ----------------------------------------------------------------------------------------------------

    注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
    若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

     

    展开全文
  • 从国外开源网站上找到的效果非常好的WPF自定义控件。切换开关控件(WpfToggleSwitch)。
  • WPF 自定义控件

    2021-05-14 11:07:51
    参考以下系列教程WPF自定义控件与样式》

    参考以下系列教程 《WPF自定义控件与样式》

    展开全文
  • wpf自定义控件库,包含列表,按钮,文本框,滚动条,进度条,消息窗体,气泡组件等多种自定义控件样式。
  • [WPF自定义控件]从ContentControl开始入门自定义控件 原文:[WPF自定义控件]从ContentControl开始入门自定义控件1. 前言 我去年写过一个在UWP自定义控件的系列博客,大部分的经验都可以用在WPF中...
  • WPF自定义控件,UserControl的制作与使用过程,这个例子采用了详细而且简介的方式讲述了WPF自定义控件的制作及调用的全过程,他适合初学者没制作过又想使用WPF自定义控件的程序员。
  • [WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互 原文:[WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互1. 前言 WPF有一个灵活的UI框架,用户可以轻松地使用代码控制控件...
  • wpf自定义控件demo

    2019-01-22 20:28:25
    自定义控件,日期,滚动条,按钮,列表 自定义控件,日期,滚动条,按钮,列表
  • 如何使用Expression Blend和Visual Studio创建WPF自定义控件
  • WPF自定义控件

    2008-07-21 20:01:36
    学习wpf自定义控件的绝好源码。
  • WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 原文:WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • WPF自定义控件 使用阿里巴巴图标

    千次阅读 2017-09-19 13:17:53
    上一篇介绍了 WPF自定义控件 按钮 (一),在进一步介绍WPF自定义控件 高级按钮之前,先介绍一下如何在WPF项目中使用阿里巴巴图标。 还是在上一篇项目基础上,在WPF自定义控件类库项目 Controls 文件夹下,新建一...
  • 接触WPF也有两个多月了,有了一定的理论基础和项目经验,现在打算写一个系列,做出来一个WPF的控件...下面这篇文章主要给大家介绍了关于WPF自定义控件和样式之自定义按钮(Button)的相关资料,需要的朋友可以参考下。
  • WPF自定义控件

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

    2011-02-21 17:42:39
    WPF自定义控件开发教程,我也在学习中。
  • WPF自定义控件 按钮 (一)

    千次阅读 2017-09-19 09:58:35
    从这里开始,记录WPF自定义控件的制作方法,相比制作传统winform的自定义控件来说,WPF自定义控件做起来更加优雅,效果也更好。 从最常用的控件 Button 开始: 首先从MSDN上查看 Button 控件的默认样式和模板,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,322
精华内容 6,128
关键字:

wpf自定义控件教程