第九章-资源与样式

1、创建资源与作用范围

  其作用范围的优先级为控件>窗体>应用程序

  作用于整体窗口或某个控件的定义方法;

    <!--窗口资源,该资源作用于整个窗口-->
    <Window.Resources>
        <!--样式资源,如果没有写x:Key属性,那么该资源对所有为该目标类型的控件均起作用-->
        <Style TargetType="Button" x:Key="btn_Style">
            <Setter Property="Background" Value="Red"></Setter>
            <Setter Property="FontSize" Value="20"></Setter>
            <Setter Property="Foreground" Value="White"></Setter>
        </Style>
    </Window.Resources>
    <StackPanel>
        <!--未指定Key时,不起作用-->
        <Button Width="60" Height="30"></Button>

        <!--使用资源-->
        <Button Width="60" Height="30" Margin="10" Style="{StaticResource btn_Style}"></Button>

        <Button Width="60" Height="30" Margin="10">
            <!--按钮资源,仅作用于该Buttton-->
            <Button.Resources>
                <Style TargetType="Button">
                    <Setter Property="Background" Value="Wheat"></Setter>
                    <Setter Property="FontSize" Value="30"></Setter>
                    <Setter Property="Foreground" Value="White"></Setter>
                </Style>
            </Button.Resources>
        </Button>
    </StackPanel>

 

作用于整个应用程序的资源定义:

  添加资源字典(实际还是xaml文件) 

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="Button" x:Key="btn_Style">
        <Setter Property="Background" Value="Red"></Setter>
        <Setter Property="FontSize" Value="20"></Setter>
        <Setter Property="Foreground" Value="White"></Setter>
    </Style>
</ResourceDictionary>

使其作用于整个应用程序:在App.xaml文件当中修改

        <ResourceDictionary>
            <!--资源合并-->
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resource/Btn_Style.xmal"></ResourceDictionary>
                <!--后面可继续添加多个资源-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

窗口当中使用资源

 <Button Width="60" Height="30" Margin="10" Style="{StaticResource btn_Style}"></Button>

 

静态资源与动态资源

  动态资源可以被后台代码修改样式后立即起作用

 

2、样式

  2.1 样式的属性

  Setters:设置属性值以及自动关联事件处理程序的Setter对象或EventSetter对象的集合

  Triggers:继承自TriggerBase类并能自动改变样式设置的对象集合。例如,当另一个属性改变时,或者当发生某个事件时,可以修改样式

  Resources:希望用于样式的资源集合。例如,可能需要使用一个对象没置多个属性。这时,更高效的做法是作为资源创建对象,然后在Setter对象中使用该资源(而不是使用嵌套的标签作为每个Setter对象的一部分创建对象)

  BasedOn:通过该属性可创建继承自(并且可以有选择地进行重写)其他详情操作单具体样式 

  TargetType:该属性标识应用样式的元素的类型。通过该属性可创建只影响特定类型元素的设置器,还可以创建能够为恰当的元素类型自动起作用的设置器

 

  2.2 使用样式对象Style 

 <Style TargetType="Button">
     <Setter Property="FontSize" Value="20"></Setter>
     <Setter Property="Background" Value="Red"></Setter>
 </Style>

 

  2.3 样式的继承BasedOn

 <Style x:Key="btn_style" TargetType="Button">
     <Setter Property="FontSize" Value="30"></Setter>
     <Setter Property="Background" Value="Red"></Setter>
 </Style>

 <Style TargetType="Button" x:Key="btn_StyleSon" BasedOn="{StaticResource btn_style}">
     <Setter Property="Foreground" Value="Blue"></Setter>
     <Setter Property="FontWeight" Value="Bold"></Setter>
 </Style>

 

3、触发器

简单触发器:一般用于修改样式值

 <Style x:Key="btn_style" TargetType="Button">
     <!--Setrwes可省略-->
     <Style.Setters>
         <Setter Property="FontSize" Value="30"></Setter>
         <Setter Property="Background" Value="Red"></Setter>
     </Style.Setters>
    
     <!--Triggers不可省略-->
     <Style.Triggers>
         <!--触发时机,
         IsMouseOver:鼠标悬停
         IsPressed:鼠标按下
         -->
         <Trigger Property="IsMouseOver" Value="True">
             <Setter Property="FontSize" Value="20"></Setter>
             <Setter Property="Background" Value="BlueViolet"></Setter>
         </Trigger>
     </Style.Triggers>
 </Style>

 

多条件触发:

 <!--多条件触发-->
 <Style.Triggers>
     <MultiTrigger>
         <MultiTrigger.Conditions>
             <Condition Property="IsMouseOver" Value="True"></Condition>
             <Condition Property="IsPressed"  Value="True"></Condition>
         </MultiTrigger.Conditions>

         <MultiTrigger.Setters>
             <Setter Property="FontSize" Value="5"></Setter>
             <Setter Property="Background" Value="Blue"></Setter>
         </MultiTrigger.Setters>
     </MultiTrigger>
 </Style.Triggers>

·

事件触发器

  适合于复杂的、动画效果

  <Style.Triggers>
      <EventTrigger RoutedEvent="MouseEnter">
          <EventTrigger.Actions>
              <BeginStoryboard>
                  <Storyboard>
                      <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="FontSize" To="60"></DoubleAnimation>
                  </Storyboard>
              </BeginStoryboard>
          </EventTrigger.Actions>
      </EventTrigger>
  </Style.Triggers>

 

4、行为

  是一类事物的共同特征,可以向用户界面添加功能

  功能是在行为类当中实现的,并附加到控件上,使得它像控件的一部分

    /// <summary>
    /// Microsoft.Xaml.Behaviors.Wpf
    /// 自定义行为:实现拖拽功能
    /// </summary>
    public class CustBehavior :Behavior<UIElement>
    {
        /// <summary>
        /// 添加功能
        /// </summary>
        protected override void OnAttached()
        {
            base.OnAttached();

            //鼠标左键按下,鼠标移动,鼠标左键放开
            this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;

            this.AssociatedObject.MouseMove += AssociatedObject_MouseMove;

            this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;

            this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove;

            this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;

        }


        private bool IsMove = false;
        private Point startPoint;//起始坐标
        private Canvas canvas;//移动元素所在画布



        /// <summary>
        /// 鼠标左键松开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void AssociatedObject_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            IsMove = false;

            Mouse.Capture(null);

        }

        /// <summary>
        /// 鼠标左键移动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            //1、鼠标是否单击左键、并且没有松开
            if(IsMove)
            {
                //2、移动
                Point nowPoint = e.GetPosition(canvas); //鼠标在画布的坐标

                AssociatedObject.SetValue(Canvas.LeftProperty,nowPoint.X-startPoint.X);
                AssociatedObject.SetValue(Canvas.TopProperty, nowPoint.Y - startPoint.Y);

            }
        }

        /// <summary>
        /// 鼠标左键按下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            //1、能够移动
            IsMove = true;

            //2、记录起始坐标
            startPoint = e.GetPosition(AssociatedObject);

            //3、移动元素捕获鼠标
            Mouse.Capture(AssociatedObject);

            //4、移动元素所在画布
            if (canvas == null)
            {
                canvas = VisualTreeHelper.GetParent(AssociatedObject) as Canvas;
            }
          
        }

    }

 

posted @ 2025-12-17 19:57  nonAny  阅读(1)  评论(0)    收藏  举报