• 稳扎稳打Silverlight(47) 4.0UI之操作剪切板, 隐式样式, CompositeTransform, 拖放外部文件到程序中


    [索引页]
    [源码下载]


    稳扎稳打Silverlight(47) - 4.0UI之操作剪切板, 隐式样式, CompositeTransform, 拖放外部文件到程序中



    作者:webabcd


    介绍
    Silverlight 4.0 用户界面(UI)相关:

    • 操作剪切板 - 支持获取或设置剪切板中的文本信息 
    • 隐式样式(Implicit Style) - 将某种样式应用到某种类型的所有元素,即全局样式 
    • CompositeTransform - 将多种转换方式合而为一 
    • 拖动(Drag)外部文件,并将其放到(Drop) Silverlight 程序中



    在线DEMO
    http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html


    示例
    1、演示如何操作剪切板
    Clipboard.xaml

    代码
    <navigation:Page x:Class="Silverlight40.UI.Clipboard" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="Clipboard Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel HorizontalAlignment="Left">
                
                
    <TextBox Name="txtMsg" Width="200" Height="50" Margin="5" />

                
    <!-- 复制 txtMsg 中的文本 -->
                
    <Button Name="btnCopy" Content="复制" Margin="5" Click="btnCopy_Click" />

                
    <!-- 将剪切板中的文本粘贴到 txtMsg -->
                
    <Button Name="btnPaste" Content="粘贴" Margin="5" Click="btnPaste_Click" />

            
    </StackPanel>
        
    </Grid>
    </navigation:Page>


    Clipboard.xaml.cs

    代码
    /*
     * Silverlight 4.0 支持对剪切板的访问,只支持获取或设置剪切板中的文本信息
     *     System.Windows.Clipboard.SetText(string s) - 将指定的字符串复制到剪切板
     *     System.Windows.Clipboard.GetText() - 获取剪切板中的文本信息
     *     
     * 只有在 Click 或 KeyDown 事件的处理程序中才可以访问剪切板
     * 访问剪切板时,Silverlight 会弹出对话框要求用户进行确认,如果用户禁止了,则会引发异常。如果程序是“被信任的应用程序”则不会弹出该对话框
     
    */

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight40.UI
    {
        
    public partial class Clipboard : Page
        {
            
    public Clipboard()
            {
                InitializeComponent();
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {

            }

            
    private void btnCopy_Click(object sender, RoutedEventArgs e)
            {
                
    try
                {
                    System.Windows.Clipboard.SetText(txtMsg.Text);
                }
                
    catch (System.Security.SecurityException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            
    private void btnPaste_Click(object sender, RoutedEventArgs e)
            {
                
    try
                {
                    txtMsg.SelectedText 
    = System.Windows.Clipboard.GetText();
                }
                
    catch (System.Security.SecurityException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }



    2、演示 Silverlight 4.0 对隐式样式(全局样式)的支持
    ImplicitStyle.xaml

    代码
    <navigation:Page x:Class="Silverlight40.UI.ImplicitStyle" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="ImplicitStyle Page">
        
    <Grid x:Name="LayoutRoot">

            
    <!--
                隐式样式(Implicit Style) - 将某种样式应用到某种类型的所有元素,即全局样式
            
    -->
            
    <ToggleButton Width="200" Height="50" Content="用于演示隐式样式(Implicit Style)。ToggleButton 的样式设置详见 Assets/ToggleButtonStyle.xaml" />
            
        
    </Grid>
    </navigation:Page>


    App.xaml

    代码
    <Application   
      
    x:Class="Silverlight40.App"
      xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml">

        
    <Application.Resources>
            
    <ResourceDictionary>
                
    <ResourceDictionary.MergedDictionaries>
                    
    <ResourceDictionary Source="Assets/ToggleButtonStyle.xaml"/>
                
    </ResourceDictionary.MergedDictionaries>
            
    </ResourceDictionary>
        
    </Application.Resources>

    </Application>


    ToggleButtonStyle.xaml

    代码
    <ResourceDictionary
      
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation">

        
    <!-- ToggleButton 的隐式样式(Implicit Style) -->
        
    <Style TargetType="ToggleButton">
            
    <Setter Property="Background" Value="#FF1F3B53"/>
            
    <Setter Property="Foreground" Value="#FF000000"/>
            
    <Setter Property="Padding" Value="3"/>
            
    <Setter Property="BorderThickness" Value="1"/>
            
    <Setter Property="BorderBrush">
                
    <Setter.Value>
                    
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        
    <GradientStop Color="#FFA3AEB9" Offset="0"/>
                        
    <GradientStop Color="#FF8399A9" Offset="0.375"/>
                        
    <GradientStop Color="#FF718597" Offset="0.375"/>
                        
    <GradientStop Color="#FF617584" Offset="1"/>
                    
    </LinearGradientBrush>
                
    </Setter.Value>
            
    </Setter>
            
    <Setter Property="Template">
                
    <Setter.Value>
                    
    <ControlTemplate TargetType="ToggleButton">
                        
    <Grid>
                            
    <VisualStateManager.VisualStateGroups>
                                
    <VisualStateGroup x:Name="CommonStates">
                                    
    <VisualState x:Name="Normal"/>
                                    
    <VisualState x:Name="MouseOver">
                                        
    <Storyboard>
                                            
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Background">
                                                
    <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                                            
    </DoubleAnimationUsingKeyFrames>
                                        
    </Storyboard>
                                    
    </VisualState>
                                    
    <VisualState x:Name="Pressed">
                                        
    <Storyboard>
                                            
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
                                                
    <SplineColorKeyFrame KeyTime="0" Value="#FFffe575"/>
                                            
    </ColorAnimationUsingKeyFrames>
                                            
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Background">
                                                
    <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                                            
    </DoubleAnimationUsingKeyFrames>
                                            
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid">
                                                
    <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                            
    </DoubleAnimationUsingKeyFrames>
                                            
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
                                                
    <EasingColorKeyFrame KeyTime="0" Value="#FFC28A30"/>
                                            
    </ColorAnimationUsingKeyFrames>
                                        
    </Storyboard>
                                    
    </VisualState>
                                    
    <VisualState x:Name="Disabled">
                                        
    <Storyboard>
                                            
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement">
                                                
    <SplineDoubleKeyFrame KeyTime="0" Value=".55"/>
                                            
    </DoubleAnimationUsingKeyFrames>
                                        
    </Storyboard>
                                    
    </VisualState>
                                
    </VisualStateGroup>
                                
    <VisualStateGroup x:Name="CheckStates">
                                    
    <VisualState x:Name="Checked">
                                        
    <Storyboard>
                                            
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Background2">
                                                
    <SplineColorKeyFrame KeyTime="0" Value="#FFffe575"/>
                                            
    </ColorAnimationUsingKeyFrames>
                                            
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Background2">
                                                
    <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                                            
    </DoubleAnimationUsingKeyFrames>
                                            
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid2">
                                                
    <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                            
    </DoubleAnimationUsingKeyFrames>
                                            
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Background2">
                                                
    <EasingColorKeyFrame KeyTime="0" Value="#FFC28A30"/>
                                            
    </ColorAnimationUsingKeyFrames>
                                        
    </Storyboard>
                                    
    </VisualState>
                                    
    <VisualState x:Name="Unchecked"/>
                                
    </VisualStateGroup>
                                
    <VisualStateGroup x:Name="FocusStates">
                                    
    <VisualState x:Name="Focused">
                                    
    </VisualState>
                                    
    <VisualState x:Name="Unfocused"/>
                                
    </VisualStateGroup>
                            
    </VisualStateManager.VisualStateGroups>
                            
    <Border x:Name="Background" BorderThickness="{TemplateBinding BorderThickness}" Background="#FFFDF7E2" CornerRadius="3" BorderBrush="#FFF0C958" Opacity="0">
                                
    <Grid x:Name="grid" Margin="1">
                                    
    <Grid.Background>
                                        
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            
    <GradientStop Color="#FFFDF7E2" Offset="1"/>
                                            
    <GradientStop Color="#FFFCEDB3"/>
                                        
    </LinearGradientBrush>
                                    
    </Grid.Background>
                                
    </Grid>
                            
    </Border>
                            
    <Border x:Name="Background2" BorderThickness="{TemplateBinding BorderThickness}" Background="#FFFDF7E2" CornerRadius="3" BorderBrush="#FFF0C958" Opacity="0">
                                
    <Grid x:Name="grid2" Margin="1">
                                    
    <Grid.Background>
                                        
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            
    <GradientStop Color="#FFFDF7E2" Offset="1"/>
                                            
    <GradientStop Color="#FFFCEDB3"/>
                                        
    </LinearGradientBrush>
                                    
    </Grid.Background>
                                
    </Grid>
                            
    </Border>
                            
    <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            
    <Rectangle x:Name="DisabledVisualElement" Fill="#FFFFFFFF" IsHitTestVisible="false" Opacity="0" RadiusY="3" RadiusX="3"/>
                            
    <Rectangle x:Name="FocusVisualElement" IsHitTestVisible="false" Margin="1" Opacity="0" RadiusY="2" RadiusX="2" Stroke="#FF6DBDD1" StrokeThickness="1"/>
                        
    </Grid>
                    
    </ControlTemplate>
                
    </Setter.Value>
            
    </Setter>
        
    </Style>
        
    </ResourceDictionary>



    3、演示 CompositeTransform 的效果
    CompositeTransform.xaml

    代码
    <navigation:Page x:Class="Silverlight40.UI.CompositeTransform" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="CompositeTransform Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel HorizontalAlignment="Left" Margin="100,0,0,0">
                
                
    <!--
                    CompositeTransform - 将多种转换方式合而为一
                        CenterX - 转换中心点的 X 坐标
                        CenterY - 转换中心点的 Y 坐标
                        Rotation - 顺时针旋转角度
                        ScaleX - 沿 X 轴方向上的缩放比例
                        ScaleY - 沿 Y 轴方向上的缩放比例
                        SkewX - X 轴扭曲角度
                        SkewY - Y 轴扭曲角度
                        TranslateX - 沿 X 轴方向上的平移距离
                        TranslateY - 沿 Y 轴方向上的平移距离
                
    -->
                
    <Rectangle Height="100" Width="100" Fill="Red">
                    
    <Rectangle.RenderTransform>
                        
    <CompositeTransform SkewX="30" Rotation="60" ScaleX="0.6" ScaleY="0.3" />
                    
    </Rectangle.RenderTransform>
                
    </Rectangle>

                
    <!-- 用 TransformGroup 的方式达到上面的 CompositeTransform 的相同效果 -->
                
    <Rectangle Height="100" Width="100" Fill="Red">
                    
    <Rectangle.RenderTransform>
                        
    <TransformGroup>
                            
    <ScaleTransform ScaleX="0.6" ScaleY="0.3" />
                            
    <SkewTransform AngleX="30" />
                            
    <RotateTransform Angle="60" />
                        
    </TransformGroup>
                    
    </Rectangle.RenderTransform>
                
    </Rectangle>

            
    </StackPanel>
        
    </Grid>
    </navigation:Page>



    4、演示如何 Drag&Drop 外部文件到 Silverlight 程序中
    DragAndDrop.xaml

    代码
    <navigation:Page x:Class="Silverlight40.UI.DragAndDrop" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="DragAndDrop Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel HorizontalAlignment="Left">

                
    <!-- 对 Silverlight 中的 UIElement 进行拖动的 Demo 详见这里 -->
                
    <HyperlinkButton NavigateUri="http://www.cnblogs.com/webabcd/archive/2008/11/13/1332450.html" TargetName="_blank" Content="在 Silverlight 中拖放 UIElement 的 Demo" />

                
    <!-- 这是 DropTarget -->
                
    <ListBox Name="listBox" Background="LightBlue" Height="400">
                    
    <ListBoxItem Content="拖动外部文件到这里,以查看演示效果" />
                
    </ListBox>

            
    </StackPanel>
        
    </Grid>
    </navigation:Page>


    DragAndDrop.xaml.cs

    代码
    /*
     * 拖放操作的 Demo - Silverlight 4.0 支持拖动外部文件到 Silverlight 程序中(支持多文件拖放,但是不支持文件夹拖放)
     * 
     * UIElement.AllowDrop - 指定 UIElement 是否可以用作于 DropTarget(拖放操作的放目标)。默认值为 false
     * UIElement.DragEnter - 拖动外部文件进入到 UIElement 时所触发的事件(事件参数类型为:DragEventArgs)
     * UIElement.DragLeave - 拖动外部文件离开 UIElement 时所触发的事件(事件参数类型为:DragEventArgs)
     * UIElement.DragOver - 拖动外部文件在 UIElement 中移动时所触发的事件(事件参数类型为:DragEventArgs)
     * UIElement.Drop - 拖动外部文件在 UIElement 中放开时所触发的事件(事件参数类型为:DragEventArgs)
     * DragEventArgs - 拖放操作所触发的拖放事件的事件参数
     *     DragEventArgs.Data - 获取与拖放事件相关联的数据(IDataObject 类型)
     * IDataObject.GetData(DataFormats.FileDrop) - 返回被拖放的外部文件的 FileInfo 数组
     
    */

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    using System.IO;
    using System.Windows.Markup;
    using System.Windows.Media.Imaging;

    namespace Silverlight40.UI
    {
        
    public partial class DragAndDrop : Page
        {
            
    public DragAndDrop()
            {
                InitializeComponent();
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                listBox.AllowDrop 
    = true;

                listBox.DragEnter 
    += new DragEventHandler(listBox_DragEnter);
                listBox.DragLeave 
    += new DragEventHandler(listBox_DragLeave);
                listBox.DragOver 
    += new DragEventHandler(listBox_DragOver);
                listBox.Drop 
    += new DragEventHandler(listBox_Drop);
            }

            
    void listBox_DragEnter(object sender, DragEventArgs e)
            {
                listBox.Items.Add(
    "DragEnter");
            }

            
    void listBox_DragLeave(object sender, DragEventArgs e)
            {
                listBox.Items.Add(
    "DragLeave");
            }

            
    void listBox_DragOver(object sender, DragEventArgs e)
            {
                
    // listBox.Items.Add("DragOver");
            }

            
    void listBox_Drop(object sender, DragEventArgs e)
            {
                listBox.Items.Add(
    "Drop");

                
    if (e.Data == null)
                    
    return;

                IDataObject dataObject 
    = e.Data as IDataObject;
                FileInfo[] files 
    = dataObject.GetData(DataFormats.FileDrop) as FileInfo[];

                
    foreach (FileInfo file in files)
                {
                    
    if (file.Exists)
                        listBox.Items.Add(
    "FileName: " + file.Name + " [FileSize: " + file.Length + "]");
                    
    else
                        listBox.Items.Add(
    "文件无效");
                }
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    LINQ语法详解
    win7下安装IIS7
    jquery ajax跨域请求webservice webconfig配置
    ServiceStack.Hello——跨平台.net REST api服务搭建
    使用ServiceStack构建Web服务
    VS2010插件之NuGet
    jQuery调用WCF
    它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供
    WCF Service Configuration Editor的使用
    jQuery验证控件jquery.validate.js使用说明+中文API
  • 原文地址:https://www.cnblogs.com/webabcd/p/1807797.html
Copyright © 2020-2023  润新知