高级桌面编程(二)

发布时间:2023年12月20日

一、前言

文章的续作前文是:

高级桌面编程(一)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/135072204?spm=1001.2014.3001.5502

二、自定义控件

1创建自定义控件,如下图所示:

2 在创建的页面可以自定义其控件外观。

举个例子:

<UserControl
    x:Class="WpfApp1.UserControl1"
    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:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Name="User"
    Width="100"
    Height="100"
    mc:Ignorable="d">
    <UserControl.Resources>
        <!--  在这里添加您需要用到的引用  -->
    </UserControl.Resources>
    <Canvas>
        <Rectangle
            Width="100"
            Height="100"
            RadiusX="12.5"
            RadiusY="12.5">
            <Rectangle.Fill>
                <LinearGradientBrush StartPoint="1,-1.68" EndPoint="0,1">
                    <GradientStop Offset="0" Color="#FFBEAF57" />
                    <GradientStop Offset="1" Color="#FFFFFFFF" />
                </LinearGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
        <Image
            Canvas.Left="14"
            Canvas.Top="5"
            Width="76"
            Height="59"
            Source="{Binding ElementName=User, Path=Imagestr}" />
        <TextBlock
            Canvas.Left="50"
            Canvas.Top="68"
            HorizontalAlignment="Center"
            VerticalAlignment="Top"
            FontSize="20"
            Text="{Binding ElementName=User, Path=YouName}"
            TextAlignment="Center"
            TextWrapping="Wrap" />
    </Canvas>
</UserControl>

使用方式:

<Window
    x:Class="WpfApp1.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"
    Title="MainWindow"
    xmlns:loc="clr-namespace:WpfApp1"
    Width="643"
    Height="384"
    BorderThickness="0"
    mc:Ignorable="d">
    <Grid>
        <loc:UserControl1 Imagestr="C:\Users\Administrator\Desktop\image\2 (4).jpg" YouName="龙"/>
    </Grid>
</Window>

注意: 创造依赖属性必须通过?DependencyProperty.Register静态的方法来配置属性。

1 DependencyProperty.Register静态方法介绍

????????具有3-5个参数的重载。前面三个参数分别:属性名称、属性的类型、包含属性的类的类型。后面参数。PropertyMetadata类型 它可以提供属性的默认值以及值更新后触发的回调。

举个例子:

 public string YouName
 {
     get { return (string)GetValue(YouNameProperty); }
     set { SetValue(YouNameProperty, value); }
 }
 public static readonly DependencyProperty YouNameProperty =
     DependencyProperty.Register(
         "YouName", 
         typeof(string), 
         typeof(UserControl1),
         new PropertyMetadata ("",Onel)
       );

 private static void Onel(DependencyObject d, DependencyPropertyChangedEventArgs e)
 {
     //值更新触发当前方法
 }

ValidateValueCallback类型的参数为验证值的回调方法。

举个例子:

   public string YouName
   {
       get { return (string)GetValue(YouNameProperty); }
       set { SetValue(YouNameProperty, value); }
   }

   public static readonly DependencyProperty YouNameProperty =
       DependencyProperty.Register(
           "YouName", 
           typeof(string), 
           typeof(UserControl1),
           new PropertyMetadata ("",Onel),
           new ValidateValueCallback(Check));
   private static bool Check(object value)
   {
       //判断的业务代码
       return false; //代表当前值无效
   }

   private static void Onel(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {

   }

提示:并非一定要创建属性来获取依赖属性的值,其实可以通过公共方法来获取依赖属性的值,如公共方法 GetValue 与SetValue?

1 FrameworkPropertyMetadata 介绍

????????其中PropertyMetadata的构造函数具有11个重载版本其中:defaultValue 默认值 、PropertyChangedCallback 回调函数 、CoerceValueCallback 强制转换属性值的类型时要调用的回调方法、bool 类型? isAnimationProhibited 指定该属性是否可在动画过程中发生变化、UpdateSouruceTrigger 数据更新的方式。

拓展


矩形控件 怎么绘制圆? 答:属性RadiusX??RadiusY

<Rectangle
    Width="100"
    Height="100"
    RadiusX="12.5"
    RadiusY="12.5">
    <Rectangle.Fill>
        <LinearGradientBrush StartPoint="1,-1.68" EndPoint="0,1">
            <GradientStop Offset="0" Color="#FFBEAF57" />
            <GradientStop Offset="1" Color="#FFFFFFFF" />
        </LinearGradientBrush>
    </Rectangle.Fill>
</Rectangle>

Pata控件中的Data是什么意思?

????????我们可以用M大写,代表我们当前开始绘制图像的一个位置,路径的一个起点。如果我们使用的是小写M则是基于上一个点的一个偏差点 如m25,0 就是相较上一个点X偏差25 Y没有偏差。其中L当我们使用L大写的时候即是代表我们要绘制一条直线,当我们小写的时候即代表我们当前这个点是相较于上一个点的距离。(相对距离)其中C代表我们要绘制一个不规则曲线,其中最后用Z结尾代表将当前的多边形进行闭合 。(L 字母大写代表绝对位置? 小写则是相对上一个点的相对位置)其实大家不理解可以直接在Xaml当中绘画一下就知道了。

举个例子:

 <Path
     Margin="0,0,35,0"
     Data="M12,0  L47,0 C18,25 17,81 23,98 35,131 54,144 63,149 L12,149  C3,149 0,143 0,136       L0,12 C0,5 3,0 12,0  z"
     Fill="#FFFFFFFF"
     Stretch="Fill"
     Stroke="{x:Null}">
     <Path.OpacityMask>
         <LinearGradientBrush StartPoint="0,-0.06" EndPoint="0.957,1.127">
             <GradientStop Offset="0" Color="#FF000000" />
             <GradientStop Offset="1" Color="#00FFFFFF" />
         </LinearGradientBrush>
     </Path.OpacityMask>
 </Path>

触发器 DataTrigger的使用方式??

????????使用触发器 DataTrigger 时,它可以帮助您在某个数据对象的属性发生变化时触发特定的操作或更改元素的状态。

举个例子(XAML中):

 <Style TargetType="Button">
     <Style.Triggers>
         <DataTrigger Binding="{Binding IsEnabled}" Value="True">
             <Setter Property="Background" Value="Green" />
         </DataTrigger>
     </Style.Triggers>
 </Style>

示例解释:

????????在上面的示例中,当绑定的属性 IsEnabled 的值为 True 时,触发器将更改连接触发器的元素的背景色为绿色。请注意,触发器还可以与其他触发器(如 EventTrigger)一起使用,以实现更复杂的动态效果。

????????本章内容学习结束,其中书中大量提到项目示例。我无法给大家提供全面的示例,只会提出几点新了解的知识点进行记录。其他知识点没提可能是经常使用很熟悉则都没有提。

其中关于自定义控件我之前的文章也有过记录,也许能帮助你拓展了解。

工作日志- - -自定义控件(详解)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/134314991?spm=1001.2014.3001.5502

文章来源:https://blog.csdn.net/qq_71897293/article/details/135094617
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。