zoukankan      html  css  js  c++  java
  • Windows Phone 7 MVVM模式通讯方式之实现Attached Behavior

    MVVM模式的View与ViewModel的三大通讯方式:Binding Data(实现数据的传递)、Command(实现操作的调用)和Attached
    Behavior(实现控件加载过程中的操作)。
     
    下面通过一个实例实现MVVM模式的Attached Behavior通讯,Attached Behavior与Command的区别就是,Attached Behavior在控件的加载过程中完成它的任务。
    下面看一下实例的运行效果:
     
    (1)MainPage.xaml页面代码,View层
    <phone:PhoneApplicationPage
    x:Class="AttachedBehaviorDemo.MainPage"
    xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone
    ="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell
    ="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local
    ="clr-namespace:AttachedBehaviorDemo"
    mc:Ignorable
    ="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily
    ="{StaticResource PhoneFontFamilyNormal}"
    FontSize
    ="{StaticResource PhoneFontSizeNormal}"
    Foreground
    ="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations
    ="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible
    ="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
    <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
    <TextBlock x:Name="PageTitle" Text="AttachedBehavior" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBlock FontSize="50" Text="金色 Gold" local:Behavior.Brush="Gold" Margin="0,6,0,504" />
    <TextBlock FontSize="50" Text="绿色 Green" local:Behavior.Brush="Green" Margin="0,94,0,416" />
    <TextBlock FontSize="50" Text="蓝色 Blue" local:Behavior.Brush="Blue" Margin="0,184,0,339" />
    <TextBlock FontSize="50" Text="橙色 Orange" local:Behavior.Brush="Orange" Margin="-3,274,3,243" />
    <TextBlock FontSize="50" Text="紫色 Purple" local:Behavior.Brush="Purple" Margin="0,386,0,133" />
    <TextBlock FontSize="50" Text="橄榄色 Olive" local:Behavior.Brush="Olive" Margin="0,497,0,0" Height="110" VerticalAlignment="Top" />
    </Grid>
    </Grid>

    </phone:PhoneApplicationPage>
    (2)Behavior.cs类代码,处理附加的属性和事件。
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Media;

    namespace AttachedBehaviorDemo
    {
    static public class Behavior
    {
    //注册一个附加属性BrushProperty,在XAML中名字为Brush,是Brush类型,在Hover类中,PropertyMetadata初始化元数据
    public static readonly DependencyProperty BrushProperty = DependencyProperty.RegisterAttached(
    "Brush",
    typeof(Brush),
    typeof(Behavior),
    new PropertyMetadata (null, new PropertyChangedCallback(OnHoverBrushChanged)));

    /// <summary>
    /// 获取Brush的属性值
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static Brush GetBrush(DependencyObject obj)
    {
    return (Brush)obj.GetValue(BrushProperty);
    }
    /// <summary>
    /// 设置属性的值
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="value"></param>
    public static void SetBrush(DependencyObject obj, Brush value)
    {
    obj.SetValue(BrushProperty, value);
    }
    /// <summary>
    /// 属性初始化
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="args"></param>
    private static void OnHoverBrushChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
    //获取属性所在的TextBlock控件
    TextBlock control = obj as TextBlock;
    //注册控件的事件
    if (control != null)
    {
    //注册鼠标进入事件
    control.MouseEnter += new MouseEventHandler(OnControlEnter);
    //注册鼠标离开事件
    control.MouseLeave += new MouseEventHandler(OnControlLeave);
    }

    }
    /// <summary>
    /// 鼠标进入事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    static void OnControlEnter(object sender, MouseEventArgs e)
    {
    //获取当前的TextBlock控件
    TextBlock control = (TextBlock)e.OriginalSource;
    //设置控件的前景颜色为红色
    control.Foreground = new SolidColorBrush(Colors.Red);
    }

    /// <summary>
    /// 鼠标离开事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    static void OnControlLeave(object sender, MouseEventArgs e)
    {
    //获取当前的TextBlock控件
    TextBlock control = (TextBlock)e.OriginalSource;
    //设置控件的前景颜色为当前控件的Brush属性的值
    control.Foreground = GetBrush(control);
    }

    }
    }
     
  • 相关阅读:
    微信支付退款部分代码
    Raspberry PI 点亮LED
    Raspberry PI 摄像头
    RaspberryPI 3B系统烧录
    MySQL基础使用
    MySQL数据库管理系统概述
    Eclipse创建JAVA项目
    Brup Suite拦截https请求
    Github 第一个仓库
    python os模块主要函数
  • 原文地址:https://www.cnblogs.com/linzheng/p/2084575.html
Copyright © 2011-2022 走看看