首页 > 其他分享 >WPF行为

WPF行为

时间:2023-12-06 10:59:14浏览次数:29  
标签:Canvas sender AssociatedObject private start WPF 行为

在WPF(Windows Presentation Foundation)中,行为被用来封装一些通用的界面功能在WPF(Windows Presentation Foundation)中,行为被用来封装一些通用的界面功能,这样可以提高代码的重用性和开发效率。行为模型虽然不是WPF的核心部分,但它仍然是一个强大的工具,能够简化UI界面XAML代码的复杂性和复用性。

与触发器不同,触发器通常只能用于同一种类型的控件,而一个行为可以在不同类型的控件下使用,只要这些控件指定了相同的父类。在实际应用中,行为常常用于实现页面效果,它可以替代或减少对元素样式(Style)和触发器(Trigger)的依赖,从而减少代码量。

创建行为

创建行为需要安装Behaviors包

创建一个行为类,用来封装事件逻辑:对象移动的事件

    // 创建一个行为类,用来封装事件逻辑:对象移动的事件 
    public class DragMoveBehavior : Behavior<FrameworkElement>
    {
        // 执行当前行为所依附的对象的事件挂载
        protected override void OnAttached()
        {
            base.OnAttached();

            AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
            AssociatedObject.MouseMove += AssociatedObject_MouseMove;
            AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
        }
        protected override void OnDetaching()
        {
            base.OnDetaching();

            AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;
            AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
            AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;
        }

        private void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            is_obj_moving = false;

            Mouse.Capture(null);
        }

        private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
        {
            if (is_obj_moving == false) return;

            //光标移动后,在Canvas上的当前位置


            Point p = e.GetPosition(AssociatedObject.Parent as Canvas);

            double offset_x = p.X - start_point.X;   // 偏移100
            double offset_y = p.Y - start_point.Y;   // 偏移50


            Canvas.SetLeft((UIElement)sender, start_x + offset_x);
            Canvas.SetTop((UIElement)sender, start_y + offset_y);
        }

        private void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            // 获取光标在Canvas上的当前位置
            start_point = e.GetPosition(AssociatedObject.Parent as Canvas);

            start_x = Canvas.GetLeft((UIElement)sender);// 当前50
            start_y = Canvas.GetTop((UIElement)sender); // 当前50

            is_obj_moving = true;

            // 把对象绑定到光标上   两种处理
            // 1、
            Mouse.Capture((UIElement)sender);
        }
        private Point start_point;
        private double start_x, start_y;
        private bool is_obj_moving = false;
    }

使用行为

在Xaml中需要引入behaviors包

为Border和Label添加行为DragMoveBehavior

<Window x:Class="Zhaoxi.EventLesson.BehaviorWindow"
        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:local="clr-namespace:Zhaoxi.EventLesson"
        xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
        mc:Ignorable="d"
        Title="BehaviorWindow" Height="450" Width="800">
    <Canvas>
        <Border Width="200" Height="50" Background="Orange" Canvas.Left="0" Canvas.Top="0">
            <b:Interaction.Behaviors>
                <local:DragMoveBehavior/>
            </b:Interaction.Behaviors>
        </Border>
        <Border Width="200" Height="50" Background="Green" Canvas.Left="200" Canvas.Top="50">
            <b:Interaction.Behaviors>
                <local:DragMoveBehavior/>
            </b:Interaction.Behaviors>
        </Border>
        <Label Content="Label" Width="100" Height="40" Background="Gray" 
               Canvas.Left="100" Canvas.Top="80">
            <b:Interaction.Behaviors>
                <local:DragMoveBehavior/>
            </b:Interaction.Behaviors>
        </Label>

        <!--目前所封装的Behavior最好不要用Button来测试-->
        <!--<Button Width="300" Height="300"/>-->
    </Canvas>
</Window>

运行效果如下,Border和Label控件可以任意拖动

标签:Canvas,sender,AssociatedObject,private,start,WPF,行为
From: https://www.cnblogs.com/ZHIZRL/p/17879012.html

相关文章

  • WPF自定义路由事件
    声明与封装创建一个继承ContentControl的类,因为封装需要使用AddHandler和RemoveHandlerRegisterRoutedEvent的参数RoutingStrategy传入RoutingStrategy.Bubble为冒泡事件,传入RoutingStrategy.Tunnel为隧道事件申明公开的eventRoutedEventHandler封装RoutedEvent///用于路由......
  • WPF触发器(Triggers)介绍
    WindowsPresentationFoundation(WPF)提供了一个丰富和灵活的图形渲染框架,触发器(Triggers)是其中一个重要的功能。触发器能够用来控制或改变UI元素的属性、样式、甚至行为。在这篇博客文章中,我们将详细介绍WPF中触发器的种类、用法,并通过一些实际例子进行讲解。1.触发器的种类在W......
  • WPF 最大化,最小化,关闭,拖拽,双击事件
    十年河东,十年河西,莫欺少年穷学无止境,精益求精代码如下publicMainView(){InitializeComponent();//最小化btnMin.Click+=(s,e)=>{this.WindowState=WindowState.Minimized;};//最大化b......
  • 学习wpf
    看到一个好文章地址:如何学好WPF-周永恒-博客园(cnblogs.com)主要是这个    1.熟悉XAML,熟悉布局,熟悉基本控件,能够根据产品端提出的原型画出界面。——(入门)2.研究事件、Style、Template,提升自己的项目能力。——(可按Winform风格实现WPF)。3.熟悉MVVM,熟悉......
  • 在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理
    WPF应用中,控件本身也可以通过实现事件代码实现拖动的处理,不过如果我们使用GongSolutions.WPF.DragDrop来处理,事情会变得更加简单轻松,它支持很多控件的拖动处理,如ListBox,ListView,TreeView,DataGrid等源自ItemsControl的控件,本篇随笔介绍在工作流模块中拖动TreeView和DataGrid......
  • 界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(上)
    DevExpressWPF的SideNavigation(侧边导航)、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或OutlookNavBar(导航栏),DevExpressWPFNavBar和Accordion控件包含了许多开发人员友好的功能,专门设计用于帮助用户构建极佳的应用功能。P.S:DevExpressWPF......
  • 如何记录SpringSecurity6.1中用户登录行为
    替换UsernamePasswordAuthenticationFilter类1.pom.xml<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId></dependency><plugin>......
  • WPF 选项卡 控件 美化
    WPF选项卡控件美化效果: 样式<LinearGradientBrushx:Key="TabItem.Selected.BordernCjh"StartPoint="0,0"EndPoint="0,1"><GradientStopColor="#FFE8A6"Offset="0.07"/><GradientStopColor=&......
  • wpf学习 Prism 使用入门
    一、手动添加安装包Prism.DryIocapp.xaml.cs修改继承基类为:PrismApplication实现其中的抽象成员:CreateShell用于指定启动的窗口类1publicpartialclassApp:PrismApplication2{3protectedoverrideWindowCreateShell()4{5......
  • WPF应用开发之控件动态内容展示
    在我们开发一些复杂信息的时候,由于需要动态展示一些相关信息,因此我们需要考虑一些控件内容的动态展示,可以通过动态构建控件的方式进行显示,如动态选项卡展示不同的信息,或者动态展示一个自定义控件的内容等等,目的就是能够减少一些硬编码的处理方式,以及能够灵活的展示数据。本篇随笔通......