Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult

今天说一下协同IResult

看一下IResult接口

 /// <summary>
    /// Allows custom code to execute after the return of a action.
    /// </summary>
    public interface IResult {
        /// <summary>
        /// Executes the result using the specified context.
        /// </summary>
        /// <param name="context">The context.</param>
        void Execute(ActionExecutionContext context);

        /// <summary>
        /// Occurs when execution has completed.
        /// </summary>
        event EventHandler<ResultCompletionEventArgs> Completed;
    }

Execute方法里写你要执行的事件,在最后执行事件Completed这是一定要执行的,不然会无法执行后继的yield部分

Execute 方法有一个ActionExecutionContext参数,这个参数与建立UI相关的IResult实现中

非常有用。它能提供的功能如下

public class ActionExecutionContext
{
    public ActionMessage Message;
    public FrameworkElement Source;
    public object EventArgs;
    public object Target;
    public DependencyObject View;
    public MethodInfo Method;
    public Func<bool> CanExecute;
    public object this[string key];
}

Message: 造成这 IResult 的调用原始 ActionMessage。

Source: FrameworkElement 触发执行的行动。

EventArgs: 与行动的触发器相关联的任何事件参数。

Target: 在实际的操作方法存在的类实例。

View: 与目标关联的视图。

Method: MethodInfo 指定要在目标实例上调用的方法。

CanExecute: 一个函数,如果操作可被调用、 虚假否则返回 true。

key index: 一个地方来存储/检索它可以对框架的扩展所使用的任何附加元数据。

做一个小Demo

源码:CaliburnIresult.rar

由于这个例子很简单我们把bootstrapper也写简单一些

    class HelloBootstrapper : Bootstrapper<MyViewModel>
    {
    }

这样就可以 了
新建一下Loader类去实现IResult接口

    public class Loader : IResult
    {
        readonly string _str;
        public Loader(string str)
        {
            _str = str;
        }
        public void Execute(ActionExecutionContext context)
        {
            MessageBox.Show(_str + context.View);
            Completed(this, new ResultCompletionEventArgs());//这个方法一定要加到这里,这个方法完成后才会执行后边的方法
        }

        public event EventHandler<ResultCompletionEventArgs> Completed = (sender, args) =>
        {
            MessageBox.Show(((Loader)sender)._str );
        };
    }

前台我们就放一下button就可以

<Window x:Class="CaliburnIresult.MyView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cal="http://www.caliburnproject.org"
        Title="MyView" Height="300" Width="300">
    <Grid>
        <Button Content="IResult"  cal:Message.Attach="MyIResultClick"/>
    </Grid>
</Window>

在ViewModel里我们看一下它的方法实现

        public IEnumerable<IResult> MyIResultClick()
        {
            yield return new Loader("load.....");
            yield return new Loader("Ok!");
        }

源码:CaliburnIresult.rar

时间: 2024-12-04 13:35:53

Caliburn.Micro学习笔记(五)----协同IResult的相关文章

Caliburn.Micro学习笔记目录——li-peng

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 Caliburn.Micro学习笔记(二)----Actions Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记目录

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 Caliburn.Micro学习笔记(二)----Actions Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro