精华内容
下载资源
问答
  • 一、创建一个简单的Binding的简单程序 1.1.数据绑定概述 数据绑定为应用程序提供了一种简单、一致的数据表示和交互方法。...WPF中的数据绑定功能与传统模型相比具有一些优势,包括本质上支持数据绑定的各种属性、灵活

    一、创建一个简单的Binding的简单程序

    1.1.数据绑定概述

    数据绑定为应用程序提供了一种简单、一致的数据表示和交互方法。元素能够以公共语言运行时(CLR)对象和XAML形式绑定到来自各种数据源的数据。ContentControl(如Button)和(ItemsControl)(如ListBox和ListView)具有内置功能,使单个数据项或数据项集合可以进行灵活的样式设置,可以在数据之上生成排序、筛选和分组视图。

    WPF中的数据绑定功能与传统模型相比具有一些优势,包括本质上支持数据绑定的各种属性、灵活的数据UI表示形式,以及业务逻辑与UI的完全分离。绑定功能为我们提供了很多便利,例如Binding对象的自动通知/刷新、Convert、Validation Rules、Two Way Binding等功能,省去了很多维护的繁琐工作。另外WPF中提供的数据模板功能,让我们可以轻松定制可以被复用的控件呈现的模块——但这是以数据绑定为前提来做到轻松易用的效果的。数据提供者例如XmlDataProvider和ObjectDataProvider更是简化了将对象以特定方式绑定并呈现的过程。可以说,数据绑定是WPF中让我们真正能够开始体会其便利性的特征之一,而对数据驱动的应用来说,其重要性不言而喻。

    数据绑定的关键是System.Windows.Data.Binding对象,它会把两个对象(UI对象与UI对象之间,UI对象与.NET数据对象之间)按照指定的方式粘合在一起,并在它们之间建立一条通信通道,绑定一旦建立,接下来的应用生命周期中它可以自己独立完成所有的同步工作。

    1.2.Binding基础

    数据绑定是一种典型用法是将服务器或本地数据放置到窗体或其他UI控件中。在WPF中,此概念得到扩展,包括了大量属性与各种数据源的绑定。在WPF中,元素的依赖项属性可以绑定到CLR对象(包括ADO.NET对象或与Web服务和Web属性相关联的对象)和XML数据。

    Binding比喻成一座数据桥梁,当一辆汽车要经过桥时,就需要指明出发地——源(Source)和目的地——目标(Target),数据从哪里来是源,到哪里去是目标,一般情况下,Binding源是逻辑层的对象,目标是UI层的控件对象。通过Binding送达UI层,被UI层所展示也就完成了数据驱动UI的过程。

    我们可以想象在Binding这座桥上铺了高速公路,不仅可以设置其方向是单向的,还可以设置为双向的,不仅如此,在双想绑定的时间甚至可以设置一些“关卡”,用来转化数据类型或者是检查数据的正确性。

    通常,每个绑定都具有4个组件:绑定目标对象、目标属性、绑定源和要使用的绑定源中的值的路径。例如,如果要将TextBox的内容绑定到Employee对象的Name属性,则目标对象是TextBox,目标属性是Text属性,要使用的值是Name,源对象是Employee对象。

    目标属性必须是依赖项属性。大多数UIElement属性都是依赖项属性,而大多数依赖项属性(除了只读属性)默认情况下都支持数据绑定。只有DependencyObject类型可以定义依赖项属性,所有UIElement都派生自DependencyObject。

    绑定源对象并不限于自定义CLR对象。WPF数据绑定支持CLR对象和XML形式的对象。绑定源可以是UIElement、任何列表对象、与ADO.NET数据或Web服务关联的CLR对象,或是包含XML数据的XmlNode。

    1.3.最简单的数据绑定

    最简单的数据绑定:一对一数据绑定,即WPF元素到WPF元素。
    如果不用数据绑定,而用事件处理程序完成,可以用C#中的ValueChanged事件处理。

    在C#代码中可以访问在XAML中声明的变量,但在XAML中不能访问C#中声明的变量,因此,要想在XAML中建立UI元素和逻辑对象的Binding还要颇费谢周折,要把逻辑代码声明为XAML中的资源(Resource)。

    数据绑定思路:
    1.确定绑定目标。就是UI元素TextBox。
    2.确定绑定属性。就是TextBox控件的Text属性。
    3.确定绑定源。就是UI元素Slider。
    4.准备Binding。
    5.使用Binding连接绑定源与绑定目标。

    对于数据源是单个数据的情况,有3种直接指定绑定数据源的方式:
    1.ElementName:源是另一个WPF元素;
    2.Source:源是一个CLR对象;
    3.RelativeSource:源和目标是同一元素。

    1.4.控制Binding的方向及数据更新

    Binding在源与目标之间架起了沟通的桥梁,默认情况下数据既可以通过Binding送达目标,也可以通过目标回到源(收集用户对数据的修改)。有时候数据只需要展示给用户,不需要用户修改,这时候可以把Binding模式设置为从目标向源的单向沟通以及只在Binding关系确立时读取一次数据,这需要我们根据实际情况选择。Binding常用属性:
    1.Converter:转换器;
    2.ElementName:绑定的源对象;
    3.FallbackValue:绑定无法返回有效值时的默认显示;
    4.Mode:绑定方式;
    5.Path:路径;
    6.RelativeSource:常用于自身绑定或数据模板中指定绑定的源对象;
    7.Source:源对象。
    8.StringFormat:格式化表达式;
    9.UpdateSourceTrigger:在绑定将发生的对象上设置事件;
    10.ValidationRules:验证规则。

    控制Binding数据流向的属性是Mode,他的类型是BindingMode的枚举。BindingMode可以取值为TwoWay、OneWay、OneTime、OneWayToSource和Default。这里的Default指的是Binding的模式会根据目标的实际情况来确定,如果是可以编辑的(TextBox的Text属性),Default就采用双向模式;如果是TextBlock,不可编辑,就使用单向模式。

    OneWay绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适合于绑定的控件为隐式只读控件的情况。

    TwoWay绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他交互式UI方案。大多数属性都默认为OneWay绑定,但是一些依赖项属性(通常为可编辑的控件的属性,如TextBox的Text属性和CheckBox的IsChecked属性)默认为TwoWay绑定。

    展开全文
  • C# wpf 实现窗体间消息传输 本文介绍WPF使用windows 自带的User32.dll中的SendMessage和FindWindow函数实现两个窗体应用程序的消息传递。 一、导入外部dll User32.dll在c盘windows\system32目录下,将它复制到VS的...

    C# wpf 实现窗体间消息传输

           本文介绍WPF使用windows 自带的User32.dll中的SendMessage和FindWindow函数实现两个窗体应用程序的消息传递。
           其中发送消息和winform的实现方式类似,但接收消息由于wpf的windows类没有类似于Form类的DefWndProc来处理消息,所以会略显复杂。

    一、导入外部dll

           User32.dll在c盘windows\system32目录下,将它复制到VS的wpf项目中bin\debug文件夹下即可。WM_COPYDATA作为系统消息。

    //定义一个全局变量作为消息,WM_COPYDATA消息的标识符为0x004A
            public const int WM_COPYDATA = 0x004A;
    
            //使用windows系统提供的user32.dll
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(int hWnd, int Msg, int wParam, IntPtr lParam);
    
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string lpWindowName);
    
    

    二、定义传递信息的结构体

    这个结构体承载消息的信息,之后以Intptr的形式作为SendMessage的参数。

    //定义传递信息的结构体,之后将其转化为Intptr后作为SendMessage的一个参数
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
    

    三、发送消息窗体按钮函数

           点击发送消息的窗体的发送按钮,发送textbox1中的消息。
           需要注意的是其中用了c#自带的marshal类来实现struct与Inptr之间的转化。

    //发送消息
            private void Button_Click(object sender, RoutedEventArgs e)
            {
            	//通过窗体类名获取被发送对象的句柄,此处该对象为window2
                int hWnd = FindWindow(null, "Window2");
                if (hWnd == 0)
                {
                    MessageBox.Show("未找到消息接受者!");
                }
                else
                {
                    byte[] sarr = System.Text.Encoding.Default.GetBytes(textBox1.Text);
                    int len = sarr.Length;
                    COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)Convert.ToInt16(0);//可以是任意值,本例中不用到
                    cds.cbData = len + 1;//指定lpData内存区域的字节数
                    cds.lpData = "MainWindow:" + textBox1.Text;//发送给目标窗口所在进程的数据
                    
                    //使用marshal将struct转化为intptr
                    // Initialize unmanged memory to hold the struct.
                    IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(cds));
                    Marshal.StructureToPtr(cds, pnt, false);
                    SendMessage(hWnd, WM_COPYDATA, 0, pnt);
                    richTextBox1.AppendText("MainWindow:" + textBox1.Text + "\n");
                }
                textBox1.Text = "";
            }
    

    四、接收消息窗体函数

    4.1 创建HwndSource对象

           创建HwndSource对象,然后利用其AddHook方法来将所有的windows消息附加到一个现有的事件中。
           WndProc函数就是WPF中类似于winform重载DefWndProc来处理消息的步骤。

    //将此函数注册到window2窗体的SourceInitialized事件后,WndProc函数就会被用于处理收到的消息
    void WSInitialized(object sender, EventArgs e)
            {
                HwndSource hs = PresentationSource.FromVisual(this) as HwndSource;
                hs.AddHook(new HwndSourceHook(WndProc));
            }
    

    4.2 WndProc消息处理函数

           根据msg消息值决定如何处理消息,仍然用Marshal类将Intptr句柄转化回struct。

    //消息处理
            protected IntPtr  WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                switch (msg)
                {
                    case WM_COPYDATA:
                        COPYDATASTRUCT cds = new COPYDATASTRUCT();
                        Type t = cds.GetType();
                        //使用marshal将intptr转换为struct
                        cds = (COPYDATASTRUCT )Marshal.PtrToStructure (lParam , typeof(COPYDATASTRUCT)); 
                        string strResult = cds.lpData + "\n";
                        richTextBox1.AppendText(strResult);
                        break;
                }
                return IntPtr.Zero;
            }
    

    参考文献:
    在WPF中使用WindowProc处理消息
    WPF中的WndProc
    C# byte[]、struct、intptr的相互转换

    展开全文
  • Events称为事件,是Windows消息机制中的重要概念之一,也是最常见的人机交互手段之一。XAML和其他开发语言类似,具有事件机能,帮助应用管理用户输入,执行不同的行为。根据用户不同的操作,执行不同的业务逻辑代码...

    一、完成登录窗体事件处理

    1.1路由事件
    Events称为事件,是Windows消息机制中的重要概念之一,也是最常见的人机交互手段之一。XAML和其他开发语言类似,具有事件机能,帮助应用管理用户输入,执行不同的行为。根据用户不同的操作,执行不同的业务逻辑代码。

    展开全文
  • WPF之1:注册热键

    2019-07-19 18:37:18
    最近做一个自动截图工具(用WPF),其中用到了热键的一点知识,参照了网上前辈们得经验, 总结如下: WPF Hot Key using System;using System.Collections.Generic;using System.Text;// new addusing System....

    最近做一个自动截图工具(用WPF),其中用到了热键的一点知识,参照了网上前辈们得经验,

    总结如下:

    WPF Hot Key
    using System;
    using System.Collections.Generic;
    using System.Text;

    // new add
    using System.Windows;
    using System.Windows.Forms;
    using System.Collections;
    using System.Windows.Interop;

    namespace RegisterHotKey
    {
    ///<summary>
    /// 直接构造类实例即可注册
    /// 自动完成注销
    /// 注意注册时会抛出异常
    /// 注册系统热键类
    /// 热键会随着程序结束自动解除,不会写入注册表
    ///</summary>
    publicclass HotKey
    {
    #region Member

    int KeyId; //热键编号
    IntPtr Handle ; //窗体句柄
    Window Window ; //热键所在窗体
    uint ControlKey ; //热键控制键
    uint Key ; //热键主键

    publicdelegatevoid OnHotKeyEventHandler(); //热键事件委托
    publicevent OnHotKeyEventHandler OnHotKey =null; //热键事件

    static Hashtable KeyPair =new Hashtable(); //热键哈希表
    privateconstint WM_HOTKEY =0x0312; // 热键消息编号

    publicenum KeyFlags //控制键编码
    {
    MOD_ALT
    =0x1,
    MOD_CONTROL
    =0x2,
    MOD_SHIFT
    =0x4,
    MOD_WIN
    =0x8
    }

    #endregion

    ///<summary>
    /// 构造函数
    ///</summary>
    ///<param name="win">注册窗体</param>
    ///<param name="control">控制键</param>
    ///<param name="key">主键</param>
    public HotKey(Window win, HotKey.KeyFlags control, Keys key)
    {
    Handle
    =new WindowInteropHelper(win).Handle;
    Window
    = win;
    ControlKey
    = (uint)control;
    Key
    = (uint)key;
    KeyId
    = (int)ControlKey + (int)Key *10;

    if (HotKey.KeyPair.ContainsKey(KeyId))
    {
    thrownew Exception("热键已经被注册!");
    }

    //注册热键
    if (false== HotKey.RegisterHotKey(Handle, KeyId, ControlKey, Key))
    {
    thrownew Exception("热键注册失败!");
    }

    //消息挂钩只能连接一次!!
    if(HotKey.KeyPair.Count==0)
    {
    if (false== InstallHotKeyHook(this))
    {
    thrownew Exception("消息挂钩连接失败!");
    }
    }

    //添加这个热键索引
    HotKey.KeyPair.Add(KeyId, this);
    }

    //析构函数,解除热键
    ~HotKey()
    {
    HotKey.UnregisterHotKey(Handle, KeyId);
    }

    #region core

    [System.Runtime.InteropServices.DllImport(
    "user32")]
    privatestaticexternbool RegisterHotKey(IntPtr hWnd, int id, uint controlKey, uint virtualKey);

    [System.Runtime.InteropServices.DllImport(
    "user32")]
    privatestaticexternbool UnregisterHotKey(IntPtr hWnd, int id);

    //安装热键处理挂钩
    staticprivatebool InstallHotKeyHook(HotKey hk)
    {
    if (hk.Window ==null|| hk.Handle == IntPtr.Zero)
    {
    returnfalse;
    }

    //获得消息源
    System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(hk.Handle);
    if (source ==null)
    {
    returnfalse;
    }

    //挂接事件
    source.AddHook(HotKey.HotKeyHook);
    returntrue;
    }

    //热键处理过程
    staticprivate IntPtr HotKeyHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, refbool handled)
    {
    if (msg == WM_HOTKEY)
    {
    HotKey hk
    = (HotKey)HotKey.KeyPair[(int)wParam];
    if (hk.OnHotKey !=null)
    {
    hk.OnHotKey();
    }
    }
    return IntPtr.Zero;
    }

    #endregion
    }
    }

    最后需要注意的是,在应用这个HotKey的时候,不能用在window的构造函数内, 需要放到loaded 事件里,因为要等到window构造完成才能够挂载系统热键,如下:

    Window_Loaded
    privatevoid Window_Loaded(object sender, RoutedEventArgs e)
    {
    HotKey hotKey
    =new HotKey(this, HotKey.KeyFlags.MOD_CONTROL | HotKey.KeyFlags.MOD_SHIFT, System.Windows.Forms.Keys.F12);
    hotKey.OnHotKey
    +=new HotKey.OnHotKeyEventHandler(hotKey_OnHotKey);
    }

    privatevoid hotKey_OnHotKey()
    {
    if (this.WindowState == WindowState.Normal)
    {
    this.WindowState = WindowState.Minimized;
    this.Hide();
    }
    else
    {
    this.Show();
    this.WindowState = WindowState.Normal;
    }
    }


     

    本文参考地址:http://www.cnblogs.com/dabaopku/archive/2010/02/21/1670793.html

    转载于:https://www.cnblogs.com/alvinyue/archive/2011/08/03/2126022.html

    展开全文
  • 注册单击和关闭事件 注册控件属性 暴露类方法Show和对象方法Close 重新计算位置 XP下运行效果 相关代码 序 本文章主要讲如何通过自定义控件配合Popup实现个性化Toast提示框,使用Net4开发,支持XP。目前主要实现了...
  • 几天遇见一个问题需要检查某个wpf程序是否已经运行,如果没有运行则启动传递参数,如果已运行则需要直接传递消息。在没有运行 情况下传递参数很简单,我们只需要Process cmd窗口启动并传递参数,在程序中处理。但是...
  • 在您的WPF,UWP或Xamarin Forms应用程序与集成。 该项目提供Prism的ILoggerFacade的自定义实现,该实现将消息转发到Serilog记录器,从而使开发人员可以在Serilog中捕获以其ViewModels和Services编写的记录事件。 给...
  • WPF 高级篇 MVVM (MVVMlight) 消息

    千次阅读 2019-12-18 14:04:34
    这一篇实现MVVMLight 消息机制 WPF 中实现View 与ViewMode 之间的通信 ...首先MVVMlight 里的Messenger来实现发送消息消息注册 先定义一个类EditBookArgs 这个类是拿来传参的 比如 传入 编辑窗...
  • 目录C#中winform和WPF通过事件(委托)实现窗体间消息传递一、定义委托参数、委托、事件二、接受消息注册事件 C#中winform和WPF通过事件(委托)实现窗体间消息传递 本文主要介绍通过事件机制实现窗体间消息传递,...
  • C# WPF 窗体传递消息

    2016-12-13 18:48:00
    对于存在窗体的WPF程序(或者说,起码在任务栏上有个图标,即ShowInTaskbar = true),互相传递消息是很容易的。 步骤: 1,寻找窗体的句柄 2,运用windows API: SendMessage或PostMessage 3,目标窗体收到消息 ...
  • WPF 利用HwndSource拦截Windows消息

    千次阅读 2017-09-21 14:07:04
    WPF提供了一个HwndSource可以使你更快的实现处理Windows消息。 通过HwndSource.FromHwnd得到的HwndSource可以添加(AddHook)移除(Remove)Hook 首先注册SourceInitialized事件,在事件中创建一个HwndSource对象, ...
  • WPF仿微信界面发送消息简易版 参考别的博主的例子用WPF MVVM框架来仿了一个微信聊天界面,做了个发送消息简易功能,下面一起来看看吧! 以下为View视图布局代码,消息对话框的样式直接在这里定义了,主要定义的是...
  • 由于最近在做wpf版的截图软件,在处理全局热键的时候,...最终,我找到了,wpf本身就支持处理系统的键盘消息(包括热键)。 使用ComponentDispatcher类处理键盘消息 下面贴上代码,方便大家复制粘贴: public...
  • WPF:ViewModel和ViewModel之间的消息交互 WPF:ViewModel和ViewModel之间的消息交互 打开了两个视图,一个视图是用户信息列表,一个视图是用户信息添加页面,如果想要达到添加信息之后,用户信息列表视图实时刷新,用...
  • WPF中事件注册方法

    千次阅读 2007-03-24 15:13:00
    WPF中的事件注册与以往的有些区别,事件的参数变为:RoutedEventArgs。示例:XAML端代码: Window x:Class="Hello.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x=...
  • WinForm和WPF注册热键

    2019-09-21 14:45:02
    /// 取消注册热键 /// </summary> /// 要取消热键的窗口的句柄</param> /// 要取消热键的ID</param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)] public static extern ...
  • 不过View除了依赖ViewModel之外对消息注册器也是会产生依赖的,而且某种类型的View一般来说都依赖固定类型的ViewModel和消息注册器,因此可以一次注入两个依赖,这样貌似就值了,至少我认为是值了,所以有了...
  • wpf MVVM

    2019-05-03 20:04:28
    WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。  我们不管是NET中还是WPF中使用模式目的就是想达到高内...
  • WPF 中,触摸默认通过 RealTimeStylus 实时触摸进来,根据官方文档,这个机制将会和 WM_Touch 触摸消息在同一个 HWND 是互斥的。而在 WPF 中按照机制,在没有禁用实时触摸下是不支持在窗口内收到 WM_Touch 触摸...
  • wpf 响应键盘按键

    2021-01-27 22:05:04
    1 注册KeyDown/KeyUp 事件 2 事件响应函数中做相关处理 /// <summary> /// 检测键盘按下 /// </summary> /// <param name="sender"></param> /// <param name..
  • 原文:WPF无边框捕获消息改变窗口大小 文章大部分转载自http://blog.csdn.net/fwj380891124,如有问题,请联系删除 最近一直在学习 WPF,看着别人做的WPF程序那么漂亮,眼红啊~ 很多漂亮的程序都是...
  • WPF中如何注册热键(转)

    千次阅读 2013-01-05 10:43:47
      WPF注册热键大荟萃 源码下载:http://www.cnblogs.com/dabaopku/archive/2010/02/22/1671267.html 研究了一晚上,终于搞定了啦~~~~~ 首先完整复制下面的第一篇文章中的代码
  • WPF 渲染原理

    2021-12-17 01:00:58
    WPF 最主要的就是渲染,因为 WPF 是一个界面框架。想用一篇博客就能告诉大家完整的 WPF 渲染原理是不可能的。本文告诉大家 WPF 从开发者告诉如何画图像到在屏幕显示的过程。本文...
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    ------WPF开发教程 目录 WPF基础入门.... 3 1. WPF基础之体系结构... 3 2. WPF基础之XAML. 9 3. WPF基础之基元素... 23 4. WPF基础之属性系统... 26 5. WPF基础之路由事件... 33 6. WPF基础之布局系统... ...
  • WPF 注册全局快捷键

    2014-07-03 10:52:00
    直接构造类实例即可注册 13 /// 自动完成注销 14 /// 注意注册时会抛出异常 15 /// 16 public class HotKey 17 // 注册系统热键类 18 // 热键会随着程序结束自动解除,不会写入...
  • WPF全局快捷键使用

    2019-11-27 15:00:47
    使用全局快捷键后,可以不切换到WPF窗口即可执行该窗口中的一些操作 需要添加的引用 using System.Runtime.InteropServices; using System.Windows.Interop; 声明的相应代码 1 static class Hotkey 2 { 3 #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,599
精华内容 1,039
关键字:

wpf消息注册