首页 > 其他分享 >WPF开发经验-实现一种通用阀门控件

WPF开发经验-实现一种通用阀门控件

时间:2022-12-19 17:36:14浏览次数:33  
标签:CommonValveControl 控件 阀门 Status typeof WPF public

一 引入

在设计设备界面时,经常会有一种需求,展示一个阀门,阀门有通断两种状态:

 

二 CommonValveControl

考虑实现一个自定义控件,CommonValveControl。

使用自定义控件比用户控件更灵活,更具扩展性,可以使用不同的样式和模板。

CommonValveControl定义两个依赖属性,Orientation表示安装展示的方向,Status表示阀门的通断状态。

public class CommonValveControl : Control
{
    static CommonValveControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CommonValveControl), new FrameworkPropertyMetadata(typeof(CommonValveControl)));
    }
   
    public bool Status
    {
        get => (bool)GetValue(StatusProperty);
        set => SetValue(StatusProperty, value);
    }
    public static readonly DependencyProperty StatusProperty = DependencyProperty.Register(
       "Status",
       typeof(bool),
       typeof(CommonValveControl));
    
    public Orientation ValveOrientation
    {
        get => (Orientation)GetValue(CommonValveOrientationProperty);
        set => SetValue(CommonValveOrientationProperty, value);
    }
    public static readonly DependencyProperty CommonValveOrientationProperty = DependencyProperty.Register(
        "ValveOrientation",
        typeof(Orientation),
        typeof(CommonValveControl));
}

设计CommonValveControl的样式模板,可通过设计不同的模板,以呈现出不同的效果。

通过ValveOrientation属性触发切换阀门的竖直状态和水平状态。

<Style TargetType="{x:Type local:CommonValveControl}">
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CommonValveControl}">
                <Viewbox Stretch="Fill">
                    <Grid>
                        <Canvas Width="40" Height="40" >
                            <Ellipse Height="40" Width="40" Fill="Gray"/>
                            <Ellipse x:Name="InnerEllipse" Height="30" Width="30" Canvas.Left="5" Canvas.Top="5" 
                            <Rectangle x:Name="Rectangle" Fill="White" RadiusX="2" RadiusY="2"/>
                        </Canvas>
                    </Grid>
                </Viewbox>
                <ControlTemplate.Triggers>
                    <Trigger Property="Status" Value="false">
                        <Setter TargetName="InnerEllipse" Property="Fill" Value="Red"/>
                    </Trigger>
                    <Trigger Property="Status" Value="true">
                        <Setter TargetName="InnerEllipse" Property="Fill" Value="Green"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ValveOrientation" Value="Horizontal"/>
                            <Condition Property="Status" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Rectangle" Property="Width" Value="6"/>
                        <Setter TargetName="Rectangle" Property="Height" Value="30"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Left" Value="17"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Top" Value="5"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ValveOrientation" Value="Horizontal"/>
                            <Condition Property="Status" Value="true"/>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Rectangle" Property="Width" Value="30"/>
                        <Setter TargetName="Rectangle" Property="Height" Value="6"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Left" Value="5"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Top" Value="17"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ValveOrientation" Value="Vertical"/>
                            <Condition Property="Status" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Rectangle" Property="Width" Value="30"/>
                        <Setter TargetName="Rectangle" Property="Height" Value="6"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Left" Value="5"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Top" Value="17"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ValveOrientation" Value="Vertical"/>
                            <Condition Property="Status" Value="true"/>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Rectangle" Property="Width" Value="6"/>
                        <Setter TargetName="Rectangle" Property="Height" Value="30"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Left" Value="17"/>
                        <Setter TargetName="Rectangle" Property="Canvas.Top" Value="5"/>
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

三 效果演示

Xaml代码:

<Canvas>
    <local:PipeControl Width="106" Height="14" Canvas.Left="26" Canvas.Top="53"/>
    <local:PipeControl Width="14" Height="80" Canvas.Left="185" Canvas.Top="22" Orientation="Vertical"/>
    <local:CommonValveControl x:Name="valve1" Status="False" ValveOrientation="Horizontal" Width="40" Height="40" Canvas.Left="60" Canvas.Top="41"/>
    <local:CommonValveControl x:Name="valve2" Status="False" ValveOrientation="Vertical" Width="40" Height="40" Canvas.Left="172" Canvas.Top="41"/>
    <Button Content="Open" Click="OpenButton_Click" Canvas.Left="272" Canvas.Top="15" Width="66" Height="35"/>
    <Button Content="Close" Click="CloseButton_Click" Canvas.Left="272" Canvas.Top="71" Width="66" Height="35"/>
</Canvas>

 后台代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void OpenButton_Click(object sender, RoutedEventArgs e)
    {
        valve1.Status = true;
        valve2.Status = true;
    }

    private void CloseButton_Click(object sender, RoutedEventArgs e)
    {
        valve1.Status = false;
        valve2.Status = false;
    }
}

 

标签:CommonValveControl,控件,阀门,Status,typeof,WPF,public
From: https://www.cnblogs.com/wwwen/p/16992344.html

相关文章

  • 控件位置大小随窗口大小的改变随着改变
    控件随着父窗口大小改变而改变位置或大小1.获得控件句柄HWNDhEdit=GetDlgItem(m_hWnd,10001);//10001是编辑框控件的ID2.获得控件的屏幕布矩形坐标RECTrcEdit......
  • [编程基础] C#自定义类调用窗体控件
    date:2017-11-0222:54:00+0800tags:-编程基础如果自定义类需要调用窗体控件,首先需要将窗体控件的可见级别(Modifiers)设为public。如下图所示:然......
  • WPF对象资源和资源词典
    资源的搜索顺序:自身资源---》父级资源---》...》窗口资源---》应用程序资源----》框架系统资源 资源的重用原则:被广泛的重用,可以使用应用程序资源;两三个窗口使用资源,建......
  • 使用WPF或AspNetCore创建简易版ChatGPT客户端,让ChatGPT成为你的私人助理
    前言:前一天写的一个ChatGPT服务端,貌似大家用起来还不是那么方便,所以我顺便用WPF和AspNetCore的webapi程序做个客户端吧,通过客户端来快速访问chatgpt模型生成对话。 1、......
  • WPF自定义搜索框控件样式
    效果图默认焦点触发新建一个用户控件,xaml代码如下:`<Grid.ColumnDefinitions><ColumnDefinitionWidth="15"></ColumnDefinition><ColumnDefi......
  • [编程基础] C#自定义类调用窗体控件
    如果自定义类需要调用窗体控件,首先需要将窗体控件的可见级别(Modifiers)设为public。如下图所示:然后在Form1类下定义静态变量form1,并初始化。 classForm1:Form{//在For......
  • wpf GridView去除右侧空白列
    页面<ListViewSizeChanged="ListView_SizeChanged"Loaded="ListView_Loaded"><ListView.View><GridView><GridViewColumnHeader="col1"Width=......
  • 日期控件选择日期范围
    引入element对日期控件  筛选月的话用月的控件 筛选周的话用周的控件 有默认值的时候(禁用规则方法写在com......
  • WPF ControlTable 初始化问题
    VS2019 问题描述:ControlTable未进行初始化导致 ControlTable.Items.Count不存在,程序生成无问题,运行时一旦进行ControlTable初始化便出错。问题解决:程序使用了TextBox......
  • 梦想CAD控件安卓交互绘图
    一、简介在cad使用过程中,动态绘制的使用会使我们绘图速度大大加快。在此演示中,我们绘制了直线、多段线、点、样条线、圆、圆弧、椭圆、椭圆弧等实体。二、绘制直线用户可以......