iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >System.Windows.Interactivity怎么在c# 项目中使用
  • 679
分享到

System.Windows.Interactivity怎么在c# 项目中使用

2023-06-06 15:06:12 679人浏览 独家记忆
摘要

这篇文章给大家介绍System.windows.Interactivity怎么在C# 项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 引入命名空间  通过在代码中引入System.Windows.Inter

这篇文章给大家介绍System.windows.Interactivity怎么在C# 项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1 引入命名空间

  通过在代码中引入System.Windows.Interactivity.dll,引入了这个dll后我们就能够使用这个里面的方法来将事件映射到ViewModel层了,我们来看看具体的使用步骤,第一步就是引入命名控件

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

  另外还可以通过另外一种方式来引入命名空间,其实这两者间都是对等的。

xmlns:i=Http://schemas.microsoft.com/expression/2010/interactivity

2 添加事件对应的Command

  这里以TextBox的GetFocus和LostFocus为例来进行说明

<TextBox Text="CommandBinding">    <i:Interaction.Triggers>        <i:EventTrigger EventName="LostFocus">            <i:InvokeCommandAction Command="{Binding OnTextLostFocus}"                                   CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType={x:Type TextBox}}}"/>        </i:EventTrigger>        <i:EventTrigger EventName="GotFocus">            <i:InvokeCommandAction Command="{Binding OnTextGotFocus}"                                   CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType={x:Type TextBox}}}"/>        </i:EventTrigger>    </i:Interaction.Triggers></TextBox>

  这个里面我们重点来看看这个InvokeCommandAction的代码结构

namespace System.Windows.Interactivity{    public sealed class InvokeCommandAction : TriggerAction<DependencyObject>    {        public static readonly DependencyProperty CommandProperty;        public static readonly DependencyProperty CommandParameterProperty;         public InvokeCommandAction();         public string CommandName { get; set; }        public ICommand Command { get; set; }        public object CommandParameter { get; set; }         protected override void Invoke(object parameter);    }}

  这里我们发现这里我们如果我们定义一个Command的话我们只能够在Command中获取到我们绑定的CommandParameter这个参数,但是有时候我们需要获取到触发这个事件的RoutedEventArgs的时候,通过这种方式就很难获取到了,这个时候我们就需要自己去扩展一个InvokeCommandAction了,这个时候我们应该怎么做呢?整个过程分成三步:

2.1 定义自己的CommandParameter

public class ExCommandParameter{    /// <summary>     /// 事件触发源     /// </summary>     public DependencyObject Sender { get; set; }    /// <summary>     /// 事件参数     /// </summary>     public EventArgs EventArgs { get; set; }    /// <summary>     /// 额外参数     /// </summary>     public object Parameter { get; set; }}

  这个对象除了封装我们常规的参数外还封装了我们需要的EventArgs属性,有了这个我们就能将当前的事件的EventArgs传递进来了。

2.2 重写自己的InvokeCommandAction

public class ExInvokeCommandAction : TriggerAction<DependencyObject>    {         private string commandName;        public static readonly DependencyProperty CommandProperty = DependencyProperty.ReGISter("Command", typeof(ICommand), typeof(ExInvokeCommandAction), null);        public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof(object), typeof(ExInvokeCommandAction), null);        /// <summary>         /// 获得或设置此操作应调用的命令的名称。         /// </summary>         /// <value>此操作应调用的命令的名称。</value>         /// <remarks>如果设置了此属性和 Command 属性,则此属性将被后者所取代。</remarks>         public string CommandName        {            get            {                base.ReadPreamble();                return this.commandName;            }            set            {                if (this.CommandName != value)                {                    base.WritePreamble();                    this.commandName = value;                    base.WritePostscript();                }            }        }        /// <summary>         /// 获取或设置此操作应调用的命令。这是依赖属性。         /// </summary>         /// <value>要执行的命令。</value>         /// <remarks>如果设置了此属性和 CommandName 属性,则此属性将优先于后者。</remarks>         public ICommand Command        {            get            {                return (ICommand)base.GetValue(ExInvokeCommandAction.CommandProperty);            }            set            {                base.SetValue(ExInvokeCommandAction.CommandProperty, value);            }        }        /// <summary>         /// 获得或设置命令参数。这是依赖属性。         /// </summary>         /// <value>命令参数。</value>         /// <remarks>这是传递给 ICommand.CanExecute 和 ICommand.Execute 的值。</remarks>         public object CommandParameter        {            get            {                return base.GetValue(ExInvokeCommandAction.CommandParameterProperty);            }            set            {                base.SetValue(ExInvokeCommandAction.CommandParameterProperty, value);            }        }        /// <summary>         /// 调用操作。         /// </summary>         /// <param name="parameter">操作的参数。如果操作不需要参数,则可以将参数设置为空引用。</param>         protected override void Invoke(object parameter)        {            if (base.AssociatedObject != null)            {                ICommand command = this.ResolveCommand();                                ExCommandParameter exParameter = new ExCommandParameter                {                    Sender = base.AssociatedObject,                    Parameter = GetValue(CommandParameterProperty),                    EventArgs = parameter as EventArgs                };                if (command != null && command.CanExecute(exParameter))                {                                        command.Execute(exParameter);                }            }        }        private ICommand ResolveCommand()        {            ICommand result = null;            if (this.Command != null)            {                result = this.Command;            }            else            {                if (base.AssociatedObject != null)                {                    Type type = base.AssociatedObject.GetType();                    PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);                    PropertyInfo[] array = properties;                    for (int i = 0; i < array.Length; i++)                    {                        PropertyInfo propertyInfo = array[i];                        if (typeof(ICommand).IsAssignableFrom(propertyInfo.PropertyType) && string.Equals(propertyInfo.Name, this.CommandName, StrinGComparison.Ordinal))                        {                            result = (ICommand)propertyInfo.GetValue(base.AssociatedObject, null);                        }                    }                }            }            return result;        }     }

  这个里面的重点是要重写基类中的Invoke方法,将当前命令通过反射的方式来获取到,然后在执行command.Execute方法的时候将我们自定义的ExCommandParameter传递进去,这样我们就能够在最终绑定的命令中获取到特定的EventArgs对象了。

2.3 在代码中应用自定义InvokeCommandAction

  <ListBox x:Name="lb_selecthistorymembers"                                    SnapsToDevicePixels="true"           ItemsSource="{Binding DataContext.SpecificHistoryMembers,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=my:AnnouncementApp},Mode=TwoWay}"           HorizontalAlignment="Stretch"           ScrollViewer.HorizontalScrollBarVisibility="Disabled"           Background="#fff"           BorderThickness="1">           <i:Interaction.Triggers>              <i:EventTrigger EventName="SelectionChanged">                 <interactive:ExInvokeCommandAction Command="{Binding DataContext.OnSelectHistoryMembersListBoxSelected,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=my:AnnouncementApp},Mode=TwoWay}"                              CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}">                 </interactive:ExInvokeCommandAction>              </i:EventTrigger>          </i:Interaction.Triggers>       </ListBox>

  注意这里需要首先引入自定义的interactive的命名空间,这个在使用的时候需要注意,另外在最终的Command订阅中EventArgs根据不同的事件有不同的表现形式,比如Loaded事件,那么最终获取到的EventArgs就是RoutedEventArgs对象,如果是TableControl的SelectionChanged事件,那么最终获取到的就是SelectionChangedEventArgs对象,这个在使用的时候需要加以区分。

3  使用当前程序集增加Behavior扩展

  System.Windows.Interactivity.dll中一个重要的扩展就是对Behavior的扩展,这个Behavior到底该怎么用呢?我们来看下面的一个例子,我们需要给一个TextBlock和Button增加一个统一的DropShadowEffect,我们先来看看最终的效果,然后再就具体的代码进行分析。

System.Windows.Interactivity怎么在c# 项目中使用

代码分析

  1 增加一个EffectBehavior

public class EffectBehavior : Behavior<FrameworkElement> { protected override void OnAttached() { base.OnAttached(); AssociatedObject.MouseEnter += AssociatedObject_MouseEnter; AssociatedObject.MouseLeave += AssociatedObject_MouseLeave; } private void AssociatedObject_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) { var element = sender as FrameworkElement; element.Effect = new DropShadowEffect() { Color = Colors.Transparent, ShadowDepth = 2 }; ; } private void AssociatedObject_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) { var element = sender as FrameworkElement; element.Effect = new DropShadowEffect() { Color = Colors.Red, ShadowDepth = 2 }; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.MouseEnter -= AssociatedObject_MouseEnter; AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave; } }

  这里我们继承自System.Windows.Interactivity中的Behavior<T>这个泛型类,这里我们的泛型参数使用FrameworkElement,因为大部分的控件都是继承自这个对象,我们方便为其统一添加效果,在集成这个基类后我们需要重写基类的OnAttached和OnDetaching方法,这个里面AssociatedObject就是我们具体添加Effect的元素,在我们的示例中这个分别是TextBlock和Button对象。

  2 在具体的控件中添加此效果

<Window x:Class="WPFBehavior.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:local="clr-namespace:WpfBehavior" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock Text="测试文本" Margin="2" Height="30"> <i:Interaction.Behaviors> <local:EffectBehavior></local:EffectBehavior> </i:Interaction.Behaviors> </TextBlock> <Button Content="测试" Width="80" Height="30" Margin="2"> <i:Interaction.Behaviors> <local:EffectBehavior></local:EffectBehavior> </i:Interaction.Behaviors> </Button> </StackPanel> </Grid></Window>

关于System.Windows.Interactivity怎么在c# 项目中使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: System.Windows.Interactivity怎么在c# 项目中使用

本文链接: https://www.lsjlt.com/news/247707.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • System.Windows.Interactivity怎么在c# 项目中使用
    这篇文章给大家介绍System.Windows.Interactivity怎么在c# 项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 引入命名空间  通过在代码中引入System.Windows.Inter...
    99+
    2023-06-06
  • Newtonsoft.Json怎么在c#项目中使用
    本篇文章为大家展示了 Newtonsoft.Json怎么在c#项目中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1 实体类的 Json 序列化和反序列化我们以如下的 Person 类举例,其中...
    99+
    2023-06-06
  • atomic怎么在c++11项目中使用
    这期内容当中小编将会给大家带来有关atomic怎么在c++11项目中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。std::atomic_flag  std::atomic_flag是一个原子的布尔类...
    99+
    2023-06-06
  • DataGridView控件怎么在C#项目中使用
    DataGridView控件怎么在C#项目中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1) 创建课程信息表创建课程信息表的 SQL 语句如下。use&n...
    99+
    2023-06-08
  • inline内联函数怎么在C++项目中使用
    本篇文章为大家展示了 inline内联函数怎么在C++项目中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。请看下面的例子:...
    99+
    2023-06-06
  • Polly如何在c#项目中使用
    今天就跟大家聊聊有关Polly如何在c#项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Polly是一个C#实现的弹性瞬时错误处理库它可以帮助我们做一些容错模式处理,比如:超...
    99+
    2023-06-14
  • 怎么在c#项目中自定义MarkupExtension
    这篇文章给大家介绍怎么在c#项目中自定义MarkupExtension,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Markup Extension,顾名思义,就是对xaml的扩展,在XAML中,规定如果属性以{}开始...
    99+
    2023-06-06
  • 如何在C#项目中使用继承
    如何在C#项目中使用继承?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。声明一个抽象类//基类    abstract clas...
    99+
    2023-06-15
  • 怎么在Vue项目中使用mock.js
    这篇文章主要讲解了“怎么在Vue项目中使用mock.js”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在Vue项目中使用mock.js”吧!在Vue项目中使用mock.js开发工具选择:...
    99+
    2023-06-27
  • 怎么在React项目中使用Redux
    这篇文章主要介绍“怎么在React项目中使用Redux”,在日常操作中,相信很多人在怎么在React项目中使用Redux问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在R...
    99+
    2022-10-18
  • ViewDragHelper怎么在Android项目中使用
    本篇文章为大家展示了 ViewDragHelper怎么在Android项目中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ViewDragHelper是support.v4下提供的用于处理拖拽滑...
    99+
    2023-05-30
    android viewdraghelper
  • ContentProvider怎么在Android项目中使用
    ContentProvider怎么在Android项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、概念及说明ContentProvider定义:内容提供者是一个An...
    99+
    2023-05-31
    android contentprovider roi
  • listfragment怎么在Android项目中使用
    本篇文章给大家分享的是有关listfragment怎么在Android项目中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、fragment简介我对fragment的理解...
    99+
    2023-05-31
    android listfragment roi
  • 怎么在vue3.0项目中使用element
    这篇文章给大家介绍怎么在vue3.0项目中使用element,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。vue是什么软件Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用...
    99+
    2023-06-06
  • web worker在项目中怎么使用
    这篇文章主要介绍“web worker在项目中怎么使用”,在日常操作中,相信很多人在web worker在项目中怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”web wo...
    99+
    2023-07-02
  • HttpURLConnection怎么在Java项目中使用
    这篇文章将为大家详细讲解有关HttpURLConnection怎么在Java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。包括使用HttpURLConnection执行get/po...
    99+
    2023-05-30
    java httpurlconnection
  • 怎么在uniapp项目中使用mqtt
    这篇文章将为大家详细讲解有关怎么在uniapp项目中使用mqtt,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、uniapp插件市场的参考插件  https://ext.dcloud.net.cn/pl...
    99+
    2023-06-15
  • 怎么在PHP项目中使用Swoole
    这篇“怎么在PHP项目中使用Swoole”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么在PHP项目中使用Swoole”文...
    99+
    2023-07-05
  • 怎么在C++项目中遍历二叉树
    怎么在C++项目中遍历二叉树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在讲遍历之前,我们要先创建一个树:#include <iostream>us...
    99+
    2023-06-08
  • 怎么在Python项目中调用C++进行封装
    怎么在Python项目中调用C++进行封装?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作