现在的位置: 首页 > 综合 > 正文

WPF Caliburn 学习笔记(四) Message Triggers

2012年09月19日 ⁄ 综合 ⁄ 共 4220字 ⁄ 字号 评论关闭
文章目录

前面我们触发事件的行为用的是普通的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); 来判断是否执行。

抱歉!评论已关闭.