• WPF系列四


    继续学习wpf的系列课程.

    首先我们看一下后台代码访问前台的UI控件.

    这块的知识比较老套,不管我们开发cs,bs都一直在使用的.在讲着系列课程的时候,我以及把所以的代码,要要讲的内容都写了一遍,发博客只是改动一些东西.

    <Window x:Class="WPFUserPanel.Window1"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="后天获取XAML 元素" Height="395" Width="395" BorderThickness="5" FlowDirection="LeftToRight" Grid.IsSharedSizeScope="False" ShowActivated="False" Background="BlanchedAlmond">

        <Window.Resources >

      </Window.Resources>

        <Grid>

            <Grid.RowDefinitions>

                <RowDefinition />

                <RowDefinition />

            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="121*" />

                <ColumnDefinition Width="123*" />

                <ColumnDefinition Width="119*" />

            </Grid.ColumnDefinitions>

            <TextBox Grid.ColumnSpan="3" Margin="27,47,31,78" Name="textBox1" FontSize="24">Hello  WPF 太神奇了</TextBox>

            <Button Grid.Row="1" Height="48" Margin="105,0,108,0" Name="button1" VerticalAlignment="Top" Click="button1_Click" Background="SandyBrown" BorderThickness="1" FontSize="18" Grid.ColumnSpan="3">第一种方式</Button>

            <Button Margin="105,54,108,76" Name="button2" Grid.Row="1" Click="button2_Click" Background="SandyBrown" BorderThickness="1" FontSize="18" Grid.ColumnSpan="3">第二种方式</Button>

            <Button Margin="105,0,108,28" Name="button3" Grid.Row="1" Click="button3_Click" Background="SandyBrown" BorderThickness="1" FontSize="18" Grid.ColumnSpan="3" Height="42" VerticalAlignment="Bottom">第三种方式</Button>

        </Grid>

    </Window>

    前台的xaml代码,没什么好说的.

    后台代码的几种访问方式.

    namespace WPFUserPanel {

        public partial class Window1 : Window {

            public Window1() {

                InitializeComponent();

            }

            void B_SizeChanged(object sender, SizeChangedEventArgs e) {

                throw new NotImplementedException();

      }

     

            private void button1_Click(object sender, RoutedEventArgs e) {

    //第一种访问的方式,刚我们可以用GetValue的方式来访问,当然你直接textBox1.Text是最简单的

                System.Windows.MessageBox.Show("" + this.textBox1.GetValue(TextBox.TextProperty).ToString());

            }

     

            private void button2_Click(object sender, RoutedEventArgs e) {

    //这个类似于开发bs的FindControl一样,来查找我们需要的控件

                TextBox t = this.FindName("textBox1") as TextBox;

                System.Windows.MessageBox.Show("第二种方式:" + t.Text);

            }

     

            private void button3_Click(object sender, RoutedEventArgs e) {

    //这种比较麻烦, 我们先找到内容

                var v = this.Content;

    //转为grid布局控件,然后把控件全部拷贝到控件数组

                Grid g = v as Grid;

                UIElementCollection uc = g.Children;

                Control[] us = new Control[uc.Count];

                g.Children.CopyTo(us, 0);

    //用linq来查找这个控件. 相信大家能看懂简单的linq, 我的linq水平也是半吊子.. 一直都是在用linqToObjects,别的也没看,看20分钟 就能简单使用了.

                string str = (us.First (a => a.Name == "textBox1") as TextBox).Text;

                System.Windows.MessageBox.Show("第三种方式:" + str);

            }

        }

    }

    我们接着玩一个纯cs文件的wpf程序,相信大家做cs的时候,经常这样玩,我以前就是,不用窗体,只用代码来写cs程序.

    我们来创建一个wpf应用程序,把所有的东西全部删掉.ok,我们把下面的代码添加进去

     

    namespace WPFLayoutDemo

    {

        class subMain : System.Windows.Application

        {

            [STAThread]//指定com的线程模型是单线程基元

            public static void Main()

            {

     

                System.Windows.Application app = new Application();

                MyWindow mw = new MyWindow();

                mw.Width = 400;

      mw.Height = 400;

                mw.BorderThickness = new Thickness(50, 5, 50, 5);

                app.Run(mw);//启动应用程序

            }

        }

     

        public partial class MyWindow : Window

        {

            Canvas canv;

            Ellipse e1;

            Button b1;

            Label lab1;

            Rectangle r1;

            public MyWindow()

            {

                canv = new Canvas();

                canv.Name = "C1";

                this.Content = canv;//让当前的对象等于canvas

                canv.Margin = new Thickness(0, 0, 0, 0);

                canv.Background = new SolidColorBrush(Colors.White);

     

                e1 = new Ellipse();

                e1.Fill = new SolidColorBrush(Colors.YellowGreen);

                e1.Stroke = new SolidColorBrush(Colors.Azure);

                e1.Width = 200;

                e1.Height = 200;

                e1.Margin = new Thickness(50, 100, 0, 0);

                canv.Children.Add(e1);//让canvas的实例去添加一个元素

     

     

                r1 = new Rectangle();

                r1.Fill = new SolidColorBrush(Colors.Tomato);

                r1.Opacity = 0.5;

                r1.Stroke = new SolidColorBrush(Colors.Red);

                r1.Width = 200;

                r1.Height = 200;

     

                r1.SetValue(Canvas.LeftProperty, (double)150);

                r1.SetValue(Canvas.TopProperty, (double)100);

                canv.Children.Add(r1);

     

     

                b1 = new Button();

                b1.Width = 100;

      b1.Height = 20;

                b1.Content = "修改圆形位置";

                b1.SetValue(Canvas.LeftProperty, (double)r1.GetValue(Canvas.LeftProperty) + 50);

                b1.SetValue(Canvas.TopProperty, (double)r1.GetValue(Canvas.TopProperty) + 50);

                b1.Click += new RoutedEventHandler(b1_Click);

                canv.Children.Add(b1);

     

     

                Label lab0 = new Label();

                lab0.Margin = new Thickness(20, 20, 0, 0);

                lab0.Width = 400;

                lab0.Height = 40;

                lab0.FontSize = 24;

                lab0.Name = "lab0";

                lab0.Content = "无XAML动态编程演示   作者:常鲲";

                canv.Children.Add(lab0);

     

                lab1 = new Label();

                lab1.Margin = new Thickness(20, 50, 0, 0);

                lab1.Width = 400;

                lab1.Height = 40;

                lab1.FontSize = 24;

                lab1.Name = "lab1";

                lab1.Content = "Location:?";

                canv.Children.Add(lab1);

    //这个是Ellipse的实例对象的MouseMove事件.

                e1.MouseMove += new System.Windows.Input.MouseEventHandler(el_MouseMove);

            }

     

            void b1_Click(object sender, RoutedEventArgs e)

            {

                Point p = System.Windows.Input.Mouse.GetPosition(canv as System.Windows.IInputElement);

             //重新设置Ellipse的位置,前面讲过两种的设置方法.

                e1.Margin = new Thickness(p.X, p.Y, 0, 0);

            }

     

     

            void el_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)

            {

                Ellipse a = e.Source as Ellipse;

    //获得当前鼠标的位置,这个是wpf重新封装的一个类库用System.Windows.Input.Mouse来获得鼠标的各种状态.

                Point p = System.Windows.Input.Mouse.GetPosition(canv as

    System.Windows.IInputElement);

                lab1.Content = "Location:" + p.ToString();//

            }

        }

    }

    总体来说,这个小技术,控件查找,动态窗体,以后会用的很多.也比较简单,好理解.

    下面我们来学习样式,样式其实和bs的样式表类似,只是写法不同而已.

    先来看一下xaml代码.

    <Window x:Class="WPF_资源和样式.Window1"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Window1" Height="400" Width="400" Loaded="Window_Loaded">

     

    <Window.Resources >//这里我定义了静态资源

    // TargetType="{x:Type Button}" 注意这句话 这是为Button设置的样式,别的控件不能使用

            <Style x:Key="GreenButtonStyle" TargetType="{x:Type Button}">

    //属性样式都是以Setter开头的

                <Setter Property="Control.Width" Value="350"/>

                <Setter Property="Control.Height" Value="100"/>

                <Setter Property="Control.FontSize" Value="24"/>

    //事件样式都是以EventSetter开头的  Event是指那种类型的事件 Handler是指向后台的一个方法

                <EventSetter Handler="Button_Click" Event="Click"></EventSetter>

            </Style>

            <SolidColorBrush x:Key="backgroundBrush">Yellow</SolidColorBrush>

            <SolidColorBrush x:Key="borderBrush">Red</SolidColorBrush>

        </Window.Resources>

    <Grid  Background="{StaticResource borderBrush}">

    //我们只需要用style来指定一下静态资源就可以了

            <Button Style="{StaticResource GreenButtonStyle}" Background="{ StaticResource backgroundBrush}">WPF 资源和样式的应用</Button>

            <Label Height="53" Margin="31,27,41,0" Name="label1" VerticalAlignment="Top" FontSize="24">WPF 中资源和样式的应用</Label>

    //这个button使用的是动态资源,后面就是这个资源的代码

            <Button Content="这是通过字典项设置的样式" Margin="17,0,17,73.163" Style="{DynamicResource GreyButton}" VerticalAlignment="Bottom" Height="35.837"  />

        </Grid>

    </Window>

    //资源字典的代码

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

        <Style x:Key="GreyButton" TargetType="Button" >

            <Setter Property="Background" Value="#00FFFF"/>

        </Style>

    </ResourceDictionary>

    //后台的代码

      private void Button_Click(object sender, RoutedEventArgs e)

            {

                global::System.Windows.MessageBox.Show("WPF 的 XAML 确实强大!");

            }

    我们后台只有一个button的click的事件,总体来说,样式只是写法不同,并没有多少技术难度.

    这章我们先认识一些比较麻烦的东西,下章开始讲解.

    依赖属性,路由事件,binding,和命令,把这些讲解完毕后,wpf的基础部分就告一段落,剩下的年后再说.

  • 相关阅读:
    ResultSet取结果集多少条记录方法及分页概要
    java ResultSet 结果集处理 createStatement() 里参数的意义(第一弹)
    提高mysql千万级数据SQL的查询优化30条总结
    WEBGL学习【十三】鼠标点击立方体改变颜色的原理与实现
    WEBGL学习【十二】鼠标操作场景
    WEBGL学习【十一】光照模型
    WEBGL学习【十】运动模型
    WEBGL学习【九】立方体贴不同的纹理
    WEBGL学习【八】模型视图投影矩阵
    WEBGL学习【七】画布绘图
  • 原文地址:https://www.cnblogs.com/chenmengmeng/p/2324431.html
Copyright © 2020-2023  润新知