zoukankan      html  css  js  c++  java
  • WPF Caliburn 学习笔记(四) Message Triggers

    前面我们触发事件的行为用的是普通的EventMessageTrigger 。其实在Caliburn中有三种事件触发模式:

    1. EventMessageTrigger
    2. GestureMessageTrigger
    3. AttachedEventMessageTrigger

    1.EventMessageTrigger

    简写:cal:Message.Attach="Divide(left.Text, right.Text) : DivideResult.Text"

    详细:

    <cal:Message.Triggers>
        <cal:RoutedMessageTriggerCollection>
            <cal:EventMessageTrigger EventName="Click">
                <cal:EventMessageTrigger.Message>
                    <cal:ActionMessage MethodName="Divide" OutcomePath="DivideResult.Text">
                        <cal:Parameter  Value="{Binding ElementName=left, Path=Text}"/>
                        <cal:Parameter Value="{Binding ElementName=right, Path=Text}"/>
                    </cal:ActionMessage>
                </cal:EventMessageTrigger.Message>
            </cal:EventMessageTrigger>
        </cal:RoutedMessageTriggerCollection>
    </cal:Message.Triggers>

    2.GestureMessageTrigger

    GestureMessageTrigger,比如:当我们需要按”CTRL+左击 ”时,执行事件。我们就要用到这个。

    简写:

    <Ellipse Width="20"
             Height="20"
             Fill="Red"
             ToolTipService.ToolTip="Divide (Attachment Gesture: Control + Left Click)"
             cal:Message.Attach="[Gesture MouseAction: LeftClick, Modifiers: Control] = 
    [Action Divide(left.Text, right.Text) : DivideResult.Text]" />

    详细:

    <Ellipse Width="20"
             Height="20"
             Fill="Yellow"
             ToolTip="Divide (Trigger Collection Gesture: Control + Left Click)">
        <cal:Message.Triggers>
            <cal:RoutedMessageTriggerCollection>
                <cal:GestureMessageTrigger MouseAction="LeftClick"
                                       Modifiers="Control">
                    <cal:GestureMessageTrigger.Message>
                        <cal:ActionMessage MethodName="Divide"
                                       OutcomePath="DivideResult.Text">
                            <cal:Parameter Value="{Binding ElementName=left, Path=Text}" />
                            <cal:Parameter Value="{Binding ElementName=right, Path=Text}" />
                        </cal:ActionMessage>
                    </cal:GestureMessageTrigger.Message>
                </cal:GestureMessageTrigger>
            </cal:RoutedMessageTriggerCollection>
        </cal:Message.Triggers>
    </Ellipse>

    3.AttachedEventMessageTrigger

    AttachedEventMessageTrigger :把事件放到父容器中。相当于共享事件。

    简写:

    <StackPanel cal:Message.Attach="[AttachedEvent Button.Click] = [Action Divide(left.Text, right.Text) : DivideResult.Text]">
        <Button Content="Divide (Stack)" />
        <Button Content="Divide (Stack)" />
    </StackPanel>

    详细:

    <StackPanel>
        <cal:Message.Triggers>
            <cal:RoutedMessageTriggerCollection>
                <cal:AttachedEventMessageTrigger RoutedEvent="Button.Click">
                    <cal:AttachedEventMessageTrigger.Message>
                        <cal:ActionMessage MethodName="Divide"
                                      OutcomePath="DivideResult.Text">
                            <cal:Parameter Value="{Binding ElementName=left, Path=Text}" />
                            <cal:Parameter Value="{Binding ElementName=right, Path=Text}" />
                        </cal:ActionMessage>
                    </cal:AttachedEventMessageTrigger.Message>
                </cal:AttachedEventMessageTrigger>
            </cal:RoutedMessageTriggerCollection>
        </cal:Message.Triggers>
     
        <Button Content="Divide (Stack)" />
        <Button Content="Divide (Stack)" />
    </StackPanel>

    AvailabilityEffect

    AvailabilityEffect属性用来显示控件的外观。比如:显示,隐藏,修改透明度等。它有如下属性:

    None,Hide,Collapse,Opacity。

    这里讲下Opacity属性的用法。

    首先新建一个OpacityEffect类,他必须继承IAvailabilityEffect接口。

    public class OpacityEffect : IAvailabilityEffect
        {
            //Note: Update the UI based on the availability.
            public void ApplyTo(DependencyObject target, bool isAvailable)
            {
                var uiElement = target as UIElement;
    
                if(uiElement == null) return;
    
                uiElement.Opacity = isAvailable ? 1 : .5;
            }
        }
    


    然后在app.xaml.cs中,我们要在创建一个容器,然后在这个容器中注册这个属性。

     

    代码


    xaml上:

     <Button Content="Divide (Attachment w/ Custom Availability)"
                    cal:Message.AvailabilityEffect="Opacity"
                    cal:Message.Attach="Divide(left.Text, right.Text) : DivideResult.Text" />
    


    效果图 下面的那个Button:

    image

    其他属性不要在容器中注册,直接设置AvailabilityEffect就行了。

    UserInRoleAttribute

    在前面我们执行一个函数,上面加个了  [Preview("CanXXX")]特性。用来判断该函数能否执行。

    返回True,则执行该函数,反之,不执行。

    还有一个特性叫:UserInRoleAttribute,该特性用来判断权限的。

    我们在某个方法上加个[UserInRole("Admin", Priority = 1)]

    我们要用到判别这个特性的类。

    代码

    这里的用户角色是:Admin,权限为1。通过返回Thread.CurrentPrincipal.IsInRole(_role); 来判断是否执行。
  • 相关阅读:
    LeetCode Related Info
    LeetCode Climbing Stairs
    Linux命令语句秘籍
    Java基础学习 —— io
    Jquery的入门学习
    Java基础学习 —— bat处理文件
    Java基础学习 —— 线程
    Java基础学习——泛型
    java基础学习——集合
    两个div叠加触发事件发生闪烁问题
  • 原文地址:https://www.cnblogs.com/dingli/p/1987653.html
Copyright © 2011-2022 走看看