• 稳扎稳打Silverlight(40) 3.0绑定之Element to Element Binding, RelativeSource; 样式之动态修改样式, 样式继承, 自定义光标


    [索引页]
    [源码下载]


    稳扎稳打Silverlight(40) - 3.0绑定之Element to Element Binding, RelativeSource; 样式之动态修改样式, 样式继承, 自定义光标


    作者:webabcd


    介绍
    Silverlight 3.0 绑定的新增功能,样式相关的新增功能
    • Element to Element Binding - Element 到 Element 之间的绑定 
    • RelativeSource - 一个扩展标记,用于指定关联数据源为 Self 或 TemplatedParent 
    • 动态修改样式 - 在 Runtime 时修改样式 
    • 样式继承 - 通过 BasedOn 使某样式可以继承自另一个样式 
    • 自定义光标 - 通过 CaretBrush 自定义输入框的光标的样式 


    在线DEMO
    http://www.cnblogs.com/webabcd/archive/2009/08/04/1538238.html


    示例
    1、Element to Element 绑定的演示
    Element2Element.xaml
    <navigation:Page x:Class="Silverlight30.Binding.Element2Element" 
               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"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="Element to Element Binding Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left">
            
                
    <!--Element to Element 绑定的支持-->
                
                
    <!--
                    绑定方式1:{Binding 绑定的属性名称, Mode=, ElementName=绑定的对象名称}
                    绑定方式2:{Binding ElementName=绑定的对象名称, Path=绑定的属性名称, Mode=}
                    Mode的可用值有:OneTime, OneWay, TwoWay
                
    -->
                
    <Slider x:Name="silder" Value="50" Minimum="1" Maximum="100" LargeChange="5" Width="500"></Slider>
                
    <TextBox Text="{Binding Value, Mode=TwoWay, ElementName=silder}" />
                
                
    <Slider Minimum="1" Maximum="100" LargeChange="5" Width="500"
                        Value
    ="{Binding ElementName=textBox, Path=Text, Mode=TwoWay }"></Slider>
                
    <TextBox x:Name="textBox" Text="50" />
                
            
    </StackPanel>
        
    </Grid>
    </navigation:Page>


    2、RelativeSource 扩展标记应用的 Demo
    RelativeSourceDemo.xaml
    <navigation:Page x:Class="Silverlight30.Binding.RelativeSourceDemo" 
               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"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="RelativeSourceDemo Page">
        
    <Grid x:Name="LayoutRoot">
        
            
    <!--
                RelativeSource - 一个扩展标记,用于指定关联数据源。这是 Silverlight 3.0 绑定的新增功能
                    RelativeSource={RelativeSource Self} - 指定数据源为自己本身
                    RelativeSource={RelativeSource TemplatedParent} - 在 ControlTemplate 出现,指定数据源为引用了该 ControlTemplate 的 Control
            
    -->
            
            
    <StackPanel>
            
                
    <StackPanel.Resources>
                    
    <ControlTemplate x:Key="myButton" TargetType="Button">
                        
    <Grid>
                            
    <!--演示 {RelativeSource TemplatedParent} 的 Demo-->
                            
    <Border x:Name="Background" CornerRadius="3" Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}">
                                
    <Grid Background="{TemplateBinding Background}"  Margin="1">
                                    
    <Border Opacity="0"  x:Name="BackgroundAnimation" Background="#FF448DCA" />
                                    
    <Rectangle x:Name="BackgroundGradient" >
                                        
    <Rectangle.Fill>
                                            
    <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1">
                                                
    <GradientStop Color="#FFFFFFFF" Offset="0" />
                                                
    <GradientStop Color="#F9FFFFFF" Offset="0.375" />
                                                
    <GradientStop Color="#E5FFFFFF" Offset="0.625" />
                                                
    <GradientStop Color="#C6FFFFFF" Offset="1" />
                                            
    </LinearGradientBrush>
                                        
    </Rectangle.Fill>
                                    
    </Rectangle>
                                
    </Grid>
                            
    </Border>
                            
    <ContentPresenter
                                  
    x:Name="contentPresenter"
                                  Content
    ="{TemplateBinding Content}"
                                  ContentTemplate
    ="{TemplateBinding ContentTemplate}"
                                  VerticalAlignment
    ="{TemplateBinding VerticalContentAlignment}"
                                  HorizontalAlignment
    ="{TemplateBinding HorizontalContentAlignment}"
                                  Margin
    ="{TemplateBinding Padding}"/>
                            
    <Rectangle x:Name="DisabledVisualElement" RadiusX="3" RadiusY="3" Fill="#FFFFFFFF" Opacity="0" IsHitTestVisible="false" />
                            
    <Rectangle x:Name="FocusVisualElement" RadiusX="2" RadiusY="2" Margin="1" Stroke="#FF6DBDD1" StrokeThickness="1" Opacity="0" IsHitTestVisible="false" />
                        
    </Grid>
                    
    </ControlTemplate>

                
    </StackPanel.Resources>

                
    <!--演示 {RelativeSource Self} 的 Demo-->
                
    <TextBlock x:Name="lbl" Text="{Binding RelativeSource={RelativeSource Self}, Path=Name}" />
                
                
    <Button Content="Button" Template="{StaticResource myButton}" Background="Red" />

            
    </StackPanel>

        
    </Grid>
    </navigation:Page>


    3、Runtime 时修改样式的演示
    ButtonStyle1.xaml(样式 1)
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:vsm
    ="clr-namespace:System.Windows;assembly=System.Windows"
    >
        
    <!--
            自定义 Button 样式 1
        
    -->
        
    <Style x:Key="myButton1" TargetType="Button">
            
    <Setter Property="Foreground" Value="Red"/>
            
    <Setter Property="Padding" Value="3"/>
            
    <Setter Property="BorderThickness" Value="3" />
            
    <Setter Property="BorderBrush" Value="Green" />
        
    </Style>
    </ResourceDictionary>

    ButtonStyle2.xaml(样式 2)
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:vsm
    ="clr-namespace:System.Windows;assembly=System.Windows"
    >
        
    <!--
            自定义 Button 样式 2
        
    -->
        
    <Style x:Key="myButton2" TargetType="Button">
            
    <Setter Property="Foreground" Value="Blue"/>
            
    <Setter Property="Padding" Value="3"/>
            
    <Setter Property="BorderThickness" Value="3" />
            
    <Setter Property="BorderBrush" Value="Red" />
        
    </Style>
    </ResourceDictionary>

    RuntimeChangeStyle.xaml
    <navigation:Page x:Class="Silverlight30.Style.RuntimeChangeStyle" 
               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"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="RuntimeChangeStyle Page">
        
    <Grid x:Name="LayoutRoot">

            
    <!--
                runtime 时修改样式的 Demo
            
    -->            
            
    <StackPanel Orientation="Horizontal">
                
    <Button x:Name="btn1" Content="Button 样式 1" Click="btn1_Click" Width="160" Height="30" Margin="10" />
                
    <Button x:Name="btn2" Content="Button 样式 2" Click="btn2_Click" Width="160" Height="30" Margin="10" />
            
    </StackPanel>
            
        
    </Grid>
    </navigation:Page>

    RuntimeChangeStyle.xaml.cs
    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.Xml.Linq;

    namespace Silverlight30.Style
    {
        
    public partial class RuntimeChangeStyle : Page
        
    {
            
    public RuntimeChangeStyle()
            
    {
                InitializeComponent();
            }


            
    private void btn1_Click(object sender, RoutedEventArgs e)
            
    {
                
    // 动态设置样式。样式来自于 Style/ButtonStyle1.xaml
                System.Windows.Style style = (System.Windows.Style)Application.Current.Resources["myButton1"];
                btn1.Style 
    = style;
                btn2.Style 
    = style;
            }


            
    private void btn2_Click(object sender, RoutedEventArgs e)
            
    {
                
    // 动态设置样式。样式来自于 Style/ButtonStyle2.xaml
                System.Windows.Style style = (System.Windows.Style)Application.Current.Resources["myButton2"];
                btn1.Style 
    = style;
                btn2.Style 
    = style;
            }

        }

    }



    4、样式的可继承性的演示
    BasedOn.xaml
    <navigation:Page x:Class="Silverlight30.Style.BasedOn" 
               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"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="BasedOn Page">
        
    <Grid x:Name="LayoutRoot">

            
    <!--
                样式的可继承性(BasedOn)的演示
            
    -->

            
    <Grid.Resources>
                
    <!--基样式-->
                
    <Style x:Key="baseButton" TargetType="Button">
                    
    <Setter Property="Foreground" Value="Red"/>
                    
    <Setter Property="Padding" Value="3"/>
                    
    <Setter Property="BorderThickness" Value="3" />
                    
    <Setter Property="BorderBrush" Value="Green" />
                
    </Style>
                
                
    <!--子样式-->
                
    <!--BasedOn - 指定当前样式的父样式(此样式会继承指定的父样式)-->
                
    <Style x:Key="myButton" TargetType="Button" BasedOn="{StaticResource baseButton}">
                    
    <Setter Property="BorderBrush" Value="Red" />
                
    </Style>
            
    </Grid.Resources>

            
    <StackPanel>
                
    <Button x:Name="btn1" Content="Button 1" Width="120" Height="30" Margin="5"
                    Style
    ="{StaticResource baseButton}"  />
                
    <Button x:Name="btn2" Content="Button 2" Width="120" Height="30" Margin="5"
                    Style
    ="{StaticResource myButton}"  />
            
    </StackPanel>

        
    </Grid>
    </navigation:Page>


    5、自定义光标的实现
    CaretBrush.xaml
    <navigation:Page x:Class="Silverlight30.Style.CaretBrush" 
               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"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="CaretBrush Page">
        
    <Grid x:Name="LayoutRoot">
            
            
    <!--
                CaretBrush - 定义输入框的光标的样式
                GradientBrush.MappingMode - 指定渐变点的位置类型 [System.Window.Media.BrushMappingMode 枚举]
                    RelativeToBoundingBox - 百分比定位(0,0 - 1,1 之间)
                    Absolute - 绝对定位
            
    -->
        
            
    <TextBox>
                
    <TextBox.CaretBrush>
                    
    <LinearGradientBrush MappingMode="RelativeToBoundingBox" StartPoint="0,0" EndPoint="0,1">
                        
    <LinearGradientBrush.GradientStops>
                            
    <GradientStop Color="Red" Offset="0.0" />
                            
    <GradientStop Color="Green" Offset="1.0" />
                        
    </LinearGradientBrush.GradientStops>
                    
    </LinearGradientBrush>
                
    </TextBox.CaretBrush>
            
    </TextBox>
            
        
    </Grid>
    </navigation:Page>


    OK
    [源码下载]
  • 相关阅读:
    算法详解(LCA&RMQ&tarjan)补坑啦!完结撒花(。◕ˇ∀ˇ◕)
    借教室(NOIP2012)
    同余方程(NOIP2012)
    开车旅行(NOIP2012)
    剑指offer-int类型负数补码中1的个数-位操作
    直接插入排序的再再改进
    剑指offer-特定二维数组中查找一个元素是否存在-二分搜索-二维数组
    递归的再一次理解-斐波那契数列
    剑指offer-顺时针打印矩阵-二维数组
    剑指offer-第一个只出现一次的字符-字符串和数组
  • 原文地址:https://www.cnblogs.com/webabcd/p/1559240.html
Copyright © 2020-2023  润新知