WPF 滑块开关 转换器 对XML的操作

今天大清早起床打开微信朋友圈看到大学同学院一哥们发的结婚的照片,在此遥祝一对新人:新婚快乐,百年好合!这哥们大学时时班长,结婚也来了好多同学,不由得觉得吾等屌丝大学确实留下了很多遗憾~哦,对了,这哥们还跟我现在在一个公司的不同部门里,听说他也混的如鱼得水,祝福!

转到正题,今天想记录的知识点有三个:

1.wpf样式实现安卓和苹果移动终端上的滑块式开关

2.wpf转换器的使用;

3.c#对xml文件的操作

说说需求,项目上要手动打开配置文件修改里面的值,确切来说是在true和false中间切换里面一个配置的值。想着给客户上线使用,让他们打开配置文件切换值肯定是不好的,就想着做个图形界面的开关。觉得手机终端的滑块式开关不错,就自己写了一个。先看手机上的滑块式开关是什么样的:

对,就要这种效果。

先看XAML界面的代码吧:

  1 <Window x:Class="ModifyConfig.MainWindow"
  2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4         xmlns:local="clr-namespace:ModifyConfig"
  5         Title="MainWindow"
  6         Width="525"
  7         Height="350">
  8     <Window.Resources>
  9
 10         <local:GradeState x:Key="GradeState" />
 11
 12         <Style x:Key="CheckRadioFocusVisual">
 13             <Setter Property="Control.Template">
 14                 <Setter.Value>
 15                     <ControlTemplate>
 16                         <Rectangle Margin="14,0,0,0"
 17                                    SnapsToDevicePixels="true"
 18                                    Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
 19                                    StrokeDashArray="1 2"
 20                                    StrokeThickness="1" />
 21                     </ControlTemplate>
 22                 </Setter.Value>
 23             </Setter>
 24         </Style>
 25         <Style x:Key="SliderCheckBox" TargetType="{x:Type CheckBox}">
 26             <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
 27             <Setter Property="BorderThickness" Value="1" />
 28             <Setter Property="Cursor" Value="Hand" />
 29             <Setter Property="Template">
 30                 <Setter.Value>
 31                     <ControlTemplate TargetType="{x:Type CheckBox}">
 32                         <ControlTemplate.Resources>
 33                             <Storyboard x:Key="StoryboardIsChecked">
 34                                 <DoubleAnimationUsingKeyFrames Storyboard.TargetName="CheckFlag" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
 35                                     <EasingDoubleKeyFrame KeyTime="0" Value="0" />
 36                                     <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="14" />
 37                                 </DoubleAnimationUsingKeyFrames>
 38                             </Storyboard>
 39                             <Storyboard x:Key="StoryboardIsCheckedOff">
 40                                 <DoubleAnimationUsingKeyFrames Storyboard.TargetName="CheckFlag" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
 41                                     <EasingDoubleKeyFrame KeyTime="0" Value="14" />
 42                                     <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0" />
 43                                 </DoubleAnimationUsingKeyFrames>
 44                             </Storyboard>
 45                         </ControlTemplate.Resources>
 46                         <BulletDecorator Background="Transparent" SnapsToDevicePixels="true">
 47                             <BulletDecorator.Bullet>
 48                                 <Border x:Name="ForegroundPanel"
 49                                         Width="35"
 50                                         Height="20"
 51                                         BorderThickness="1"
 52                                         CornerRadius="10">
 53                                     <Canvas>
 54                                         <Border x:Name="CheckFlag"
 55                                                 Width="19"
 56                                                 Height="18"
 57                                                 VerticalAlignment="Center"
 58                                                 Background="{Binding Converter={StaticResource GradeState} }"
 59                                                 BorderThickness="1"
 60                                                 CornerRadius="10"
 61                                                 RenderTransformOrigin="0.5,0.5">
 62                                             <Border.RenderTransform>
 63                                                 <TransformGroup>
 64                                                     <ScaleTransform />
 65                                                     <SkewTransform />
 66                                                     <RotateTransform />
 67                                                     <TranslateTransform />
 68                                                 </TransformGroup>
 69                                             </Border.RenderTransform>
 70                                             <Border.Effect>
 71                                                 <DropShadowEffect Direction="180" ShadowDepth="1" />
 72                                             </Border.Effect>
 73                                         </Border>
 74                                     </Canvas>
 75                                 </Border>
 76                             </BulletDecorator.Bullet>
 77                             <ContentPresenter Margin="{TemplateBinding Padding}"
 78                                               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
 79                                               VerticalAlignment="Center"
 80                                               RecognizesAccessKey="True"
 81                                               SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
 82                         </BulletDecorator>
 83                         <ControlTemplate.Triggers>
 84                             <Trigger Property="HasContent" Value="true">
 85                                 <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}" />
 86                                 <Setter Property="Padding" Value="4,0,0,0" />
 87                             </Trigger>
 88                             <Trigger Property="IsEnabled" Value="false">
 89                                 <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
 90                             </Trigger>
 91                             <Trigger Property="IsChecked" Value="True">
 92                                 <Setter TargetName="ForegroundPanel" Property="Background" Value="LightGreen" />
 93                                 <Trigger.EnterActions>
 94                                     <BeginStoryboard x:Name="BeginStoryboardCheckedTrue" Storyboard="{StaticResource StoryboardIsChecked}" />
 95                                     <RemoveStoryboard BeginStoryboardName="BeginStoryboardCheckedFalse" />
 96                                 </Trigger.EnterActions>
 97                             </Trigger>
 98                             <Trigger Property="IsChecked" Value="False">
 99                                 <Setter TargetName="ForegroundPanel" Property="Background" Value="LightGray" />
100                                 <Trigger.EnterActions>
101                                     <BeginStoryboard x:Name="BeginStoryboardCheckedFalse" Storyboard="{StaticResource StoryboardIsCheckedOff}" />
102                                     <RemoveStoryboard BeginStoryboardName="BeginStoryboardCheckedTrue" />
103                                 </Trigger.EnterActions>
104                             </Trigger>
105                         </ControlTemplate.Triggers>
106                     </ControlTemplate>
107                 </Setter.Value>
108             </Setter>
109         </Style>
110     </Window.Resources>
111     <Canvas>
112         <TextBlock Text="是否开启考试模式:" Canvas.Left="27" Canvas.Top="12" />
113         <CheckBox Width="200"
114                   Height="23"
115                   Style="{DynamicResource SliderCheckBox}"
116                   x:Name="Switch_IsExamMode"
117                   Click="IsExamMode_Click" Canvas.Left="132" Canvas.Top="12" />
118
119     </Canvas>
120 </Window>

下面的是后台cs文件的代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Windows;
  6 using System.Windows.Controls;
  7 using System.Windows.Data;
  8 using System.Windows.Documents;
  9 using System.Windows.Input;
 10 using System.Windows.Media;
 11 using System.Windows.Media.Imaging;
 12 using System.Windows.Navigation;
 13 using System.Windows.Shapes;
 14 using System.Xml;
 15 using System.Globalization;
 16
 17 namespace ModifyConfig
 18 {
 19     /// <summary>
 20     /// MainWindow.xaml 的交互逻辑
 21     /// </summary>
 22     public partial class MainWindow : Window
 23     {
 24         /// <summary>
 25         /// 是否考试模式
 26         /// </summary>
 27         private bool _isExamMode;
 28
 29         /// <summary>
 30         /// 是否考试模式
 31         /// </summary>
 32         public bool IsExamMode
 33         {
 34             get { return _isExamMode; }
 35             set { _isExamMode = value; }
 36         }
 37
 38         /// <summary>
 39         /// 主窗口初始化
 40         /// </summary>
 41         public MainWindow()
 42         {
 43             InitializeComponent();
 44             Switch_IsExamMode.IsChecked = GetIsExamMode();
 45             IsExamMode = (bool)Switch_IsExamMode.IsChecked;
 46             Switch_IsExamMode.DataContext = IsExamMode;
 47         }
 48         /// <summary>
 49         /// 点击开关触发的事件
 50         /// </summary>
 51         /// <param name="sender"></param>
 52         /// <param name="e"></param>
 53         private void IsExamMode_Click(object sender, RoutedEventArgs e)
 54         {
 55             IsExamMode = (bool)Switch_IsExamMode.IsChecked;
 56             Switch_IsExamMode.DataContext = IsExamMode;
 57             SetIsExamMode();
 58         }
 59         /// <summary>
 60         /// 得到XML文件中的节点值
 61         /// </summary>
 62         /// <returns></returns>
 63         private bool GetIsExamMode()
 64         {
 65             XmlDocument xmlDoc = new XmlDocument();
 66             xmlDoc.Load(@"..\..\..\config\Platform.System.Config");
 67             XmlNodeList accountList = xmlDoc.SelectSingleNode("configuration").ChildNodes;
 68             foreach (XmlNode account in accountList)
 69             {
 70                 if (account.Name == "add" && account.Attributes["key"].Value.ToString() == "InExamMode")
 71                 {
 72                     return account.Attributes["value"].Value == "True" ? true : false;
 73                 }
 74             }
 75             return false;
 76         }
 77         /// <summary>
 78         /// 向xml文件中写入值
 79         /// </summary>
 80         private void SetIsExamMode()
 81         {
 82             XmlDocument xmlDoc = new XmlDocument();
 83             xmlDoc.Load(@"..\..\..\config\Platform.System.Config");
 84             XmlNodeList accountList = xmlDoc.SelectSingleNode("configuration").ChildNodes;
 85             foreach (XmlNode account in accountList)
 86             {
 87                 if (account.Name == "add")
 88                 {
 89                     //if account exists
 90                     if ("InExamMode" == account.Attributes["key"].Value.ToString())
 91                     {
 92                         if ((bool)Switch_IsExamMode.IsChecked)
 93                         {
 94                             account.Attributes["value"].Value = "True";
 95                         }
 96                         else
 97                         {
 98                             account.Attributes["value"].Value = "False";
 99                         }
100                         xmlDoc.Save(@"..\..\..\config\Platform.System.Config");
101                     }
102                 }
103             }
104         }
105     }
106     /// <summary>
107     /// 转换器
108     /// </summary>
109     public class GradeState : IValueConverter
110     {
111         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
112         {
113             if (value == null)
114                 return null;
115             dynamic data = value;
116             if ((bool)data)
117                 return new SolidColorBrush(Colors.Green);
118             else
119                 return new SolidColorBrush(Colors.Gray);
120         }
121         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
122         {
123             throw new NotImplementedException();
124         }
125     }
126 }

样式实现滑块开关没什么难度,说说转换器,转换器的使用,1.增加一个转换器的类,它继承于接口IValueConverter,2.实现该接口的两个方法,Convert(object value, Type targetType, object parameter, CultureInfo culture)和ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);第二个方法一般都是throw new NotImplementedException();3.XAML界面资源里声明该转换器(第10行);4.XAML界面需要转换的地方使用该转换器(第58行)。

xml文件的操作我这边比较简单,有读取节点属性值和设置节点值两个功能。

下面是我们的配置文件Platform.System.Config

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <add key="TradeMainVersion" value="1" />
 4   <add key="IsDebugMode" value="False" />
 5   <add key="IsStartHardDiskNumber" value="False" />
 6   <add key="PlatformTitle" value="综合业务前端系统" />
 7   <add key="PagesDirectory" value="TellerSysPages" />
 8   <add key="UpdateApplication" value="TellerSystem.Update.exe" />
 9   <add key="TempFilePath" value="tmp/" />
10   <add key="ConfigFilePath" value="TellerSysconf/" />
11   <!--是否启动动画-->
12   <add key="AnimationEnable" value="True" />
13   <!--是否启用权限控制-->
14   <add key="IsPowerCheckByUser" value="False" />
15   <!--启用项目层更新交易dll True:项目层更新,False:底层更新 -->
16   <add key="IsFromProjectDownLoadTradeDll" value="False" />
17   <!--是否启用客户端更新-->
18   <add key="IsUpdateCheckForClient" value="True" />
19   <!--是否越过支付密码器检查-->
20   <add key="IsSkipCheckPayPassword" value="True" />
21   <!--是否越过验印流水检查-->
22   <add key="IsSkipCheckYanYinWater" value="True" />
23   <!--是否启用考试模式-->
24   <add key="InExamMode" value="False" />
25   <!--是否外设调试模式-->
26   <add key="InDeviceDebugMode" value="True" />
27 </configuration>

看看最后的运行结果:

关闭时:

开启时:

下载源码压缩包链接:http://files.cnblogs.com/files/zhangyongheng/ModifyConfig.rar

2015-05-05 10:43:53

时间: 2024-10-09 16:53:55

WPF 滑块开关 转换器 对XML的操作的相关文章

xml文件操作

一.xml文件操作1.了解xml文件的SAX解析方式 1.1SAX解析XML  //第一步:解析xml的对象  //工厂模式   SAXParser parser = SAXParserFactory       .newInstance()       .newSAXParser();  //第二步:获得xml文件   InputStream is = getResources().openRawResource(R.raw.shu);  //第三步: 处理器   DefaultHandler

XML常用操作

C#操作XML非常简单 一是写入: 生明一个xelment 再在它的父节点Add就可以,也可以用生明的节点.SetAttribute("节点名称","节点对应的值"); 二是读取: 一样也是先生明再得到其子节点再                    if (xe.Name == "Contrast")                                            if (xe.GetAttribute("IsS

Linq To XML 简单操作

加载xml文件和保存xml文件 XDocument doc = XDocument.Load(Server.MapPath("\\xmlfile\\Book.xml")); doc.Save(Server.MapPath("\\xmlfile\\BookBackup.xml")); 创建元素 XElement xe = new XElement("book",new XElement("bookname","asp.

python解析xml文件操作的例子

python解析xml文件操作实例,操作XML文件的常见技巧. xml文件内容: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first> <last>

xml的操作-解析篇

2014-05-04 11:16 吴文付 工作上,学习上,肯定会碰到xml的操作.这里提供详细的xml解析方法. 这里的规划如下:简单的布局3个按钮.3个按钮,对应3种解析xml的方法.分别为 sax解析 dom解析 pull解析 12:56 完成了dom的解析.比较简单. xml的操作-解析篇,布布扣,bubuko.com

01操作XML—C#操作XML文件基础知识

学习笔记,如有错误请指正.?号处也请各位指点下,谢谢. 有一个XML,文件名为“UserInfo.xml”,操作如下: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <users> <user1 姓名="张三" 密码="123">我是张三</user1> <user2 姓名="李四

android xml文件操作

//xml 写操作        XmlSerializer serializer = Xml.newSerializer();                FileOutputStream outputStream = context.openFileOutput("xmlwriter.xml", Context.MODE_PRIVATE);                StringWriter writer=new StringWriter();        serializ

WPF Binding值转换器ValueConverter使用简介(二)-IMultiValueConverter

注: 需要继承IMultiValueConverter接口,接口使用和IValueConverter逻辑相同. 一.MultiBinding+Converter 多值绑定及多值转换实例 当纵向流量大于横向流量时指示灯应为绿色,当纵向流量小于横向流量时指示灯应为红色,否则指示灯为黄色. 1.定制ColorConverter类,此时Convert中参数是object[] values,values[0]对应MultiBinding中的第一个Binding值,这里是纵向流量值,依此类推,可以在Mult

SQL SERVER中对XML进行操作

一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB). 用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中. 随着SQL Server 对XML字段的支持,相应的,T-