wp7学习笔记

1.xap:最终是压缩包;最终部署有系统控制,防止流亡软件;放到固有位置productid;有的文件放在.dll中或直接放入目录下;控制有生成操作:content,内容,content效率更高不用从.dll文件解压出来;resource则放入.dll中;

2.xaml是编译到dll资源中去,然后允许通过loadcomponent加载xaml文件,通过findName获得控件实例;

3.布局:

 <Canvas>绝对位置;Canvas.Left="100" Canvas.Top="300"来调整位置;

  <StackPanel Orientation="Horizontal">:默认垂直;

4.Canvas.SetTop(a, Canvas.GetTop(a) + 100);Canvas

5.  TextBox t1 = new TextBox();

                t1.Text = "n" + i.ToString();

                sp1.Children.Add(t1);

7. TextBox tt = this.FindName("n2") as TextBox;

 8. <TextBlock.Foreground>

                <SolidColorBrush Color="blue" ></SolidColorBrush>

            </TextBlock.Foreground>

9.渐变:

  <TextBlock.Foreground>

               <LinearGradientBrush StartPoint="0,1" EndPoint="1,1" >(渐变方向表示从上到下)

                     <GradientStop Offset="0.2" Color="Blue"></GradientStop>

                     <GradientStop Offset="0.9" Color="Yellow"></GradientStop>

  </LinearGradientBrush>

10.(从中心向外面扩散)

 <TextBlock.Foreground>

               <RadialGradientBrush >

                     <GradientStop Offset="0.1" Color="Blue"></GradientStop>

                     <GradientStop Offset="0.6" Color="Yellow"></GradientStop>

               </RadialGradientBrush>

            </TextBlock.Foreground>

(stroke)边框颜色;thickness:宽度;

11.   <Rectangle Width="100" Height="100" Stroke="Green" StrokeThickness="10">

               

            </Rectangle>

12.

                        <GradientStop Offset="0.3" Color="Blue"></GradientStop>

                        <GradientStop Offset="0.5" Color="Yellow"></GradientStop>

                        <GradientStop Offset="0.8" Color="red"></GradientStop>

 

----表示:(0.3以内为蓝色;0.3-o.5由蓝色变为黄色;0.5到0.8由换色为红色);0.8以外为红色;

 

--------- <TextBlock.Foreground>

               <ImageBrush ImageSource="Img/010.png"></ImageBrush>

            </TextBlock.Foreground>(用图片渲染;)

 

------------旋转:(angel角度;rotate:旋转)angle>0顺时针;<0逆时针;

 <StackPanel>

            <Button Content="sdfsfs" Width="200" Height="100">

                <Button.RenderTransform>

                    <RotateTransform Angle="-10"></RotateTransform>

                </Button.RenderTransform>

            </Button>

        </StackPanel>

 

----------- <RotateTransform Angle="20" CenterX="100" CenterY="500"></RotateTransform>:默认0,0通过centerx,center来设定旋转中心;

 

---- <ScaleTransform ScaleX="0.4"></ScaleTransform>缩放横放;沿x轴和纵轴;

 

-------   <SkewTransform AngleX="" AngleY="50"></SkewTransform>歪斜,沿x轴,沿y轴;anglex:x轴不变;

------如果控件是从frameElement继承过来可以。出name;不过不是必须是x:name;

---------------

using System.Windows.Threading;//时间命名控件

  private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)

        {

            DispatcherTimer d = new DispatcherTimer();//定时器;(解决多线程问题)

            d.Interval = TimeSpan.FromSeconds(1);

            d.Tick += new EventHandler(d_Tick);

            d.Start();

        }

 

        void d_Tick(object sender, EventArgs e)

        {

            sd.AngleY += 10;

        }

    }

----------------样式:(指定name后 Style="{ StaticResource aa }"来引用样式)base on 指的是继承样式;

 <phone:PhoneApplicationPage.Resources>

        <Style TargetType="Button">

            <Setter Property="Background" Value="Yellow">

            </Setter>

        </Style>

        <Style TargetType="Button" x:Name="aa">

            <Setter Property="Background" Value="Red">

            </Setter>

        </Style>

        <Style TargetType="Button" BasedOn="{StaticResource aa}" x:Name="ba">

            <Setter Property="FontSize"  Value="88">

            </Setter>

        </Style>

    </phone:PhoneApplicationPage.Resources>

 

----------样式表:新建xml文件重新命名为xaml;

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

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

    <Style TargetType="Button">

        <Setter Property="Background" Value="Yellow">

        </Setter>

    </Style>

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

        <Setter Property="Background" Value="Red">

        </Setter>

    </Style>

    <Style TargetType="Button" BasedOn="{StaticResource aa}" x:Key="ba">

        <Setter Property="FontSize"  Value="88">

        </Setter>

    </Style>

</ResourceDictionary>

---xaml文件引用样式:

<phone:PhoneApplicationPage.Resources>

        <ResourceDictionary Source="style.xaml"></ResourceDictionary>

</phone:PhoneApplicationPage.Resources>

 

--------如果只有一个样式表,比较简单的话;

直接放入app.xaml的resource中更好;

所有页面都自动引用;

 

----------------动态修改image图片;

using System.Windows.Media.Imaging;//image的命名空进啊

 bb.Source = new BitmapImage(new Uri("Img/1.jpg",UriKind.Relative));//相对的路径

------------------换肤功能:

添加样式文件;xaml中不能定义样式

<phone:PhoneApplicationPage.Resources>

        <!--<ResourceDictionary Source="style1.xaml">

           

        </ResourceDictionary>-->

    </phone:PhoneApplicationPage.Resources>

2.后台代码:

  private void a_Click(object sender, RoutedEventArgs e)

        {

            ResourceDictionary rd = new ResourceDictionary();

            rd.Source = new Uri("/PhoneApp1;component/skin/style2.xaml", UriKind.Relative);

//|路径固定写法(phoneapp1:程序及名称)component/路径|

            AppStyle(rd);

        }

        private static void AppStyle(ResourceDictionary rd)

        {

            App.Current.Resources.MergedDictionaries.Clear();

            App.Current.Resources.MergedDictionaries.Add(rd);

        }

 

        private void b_Click(object sender, RoutedEventArgs e)

        {   //动态将样式文件添加到app.xaml中去;

            ResourceDictionary rd = new ResourceDictionary();

            rd.Source = new Uri("/PhoneApp1;component/skin/style1.xaml", UriKind.Relative);

            AppStyle(rd);

        }

-----------多语言一样:添加 xmlns:sys="clr-namespace:System;assembly=mscorlib"

--------------通过模板改变整体外观;

<Button Content="点击" Click="Button_Click" Height="110" Width="126">

                <Button.Template>

                    <ControlTemplate>

                        <Ellipse Width="100" Height="100" Fill="Red">

                        </Ellipse>

                    </ControlTemplate>

                </Button.Template>

</Button>

-------------------

 <phone:PhoneApplicationPage.Resources>

        <ControlTemplate x:Name="a">

            <Grid>

                <Ellipse Width="100" Height="100" Fill="Red">

                </Ellipse>

                <TextBlock Text="sfs" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>

            </Grid>

        </ControlTemplate>

    </phone:PhoneApplicationPage.Resources>

----

  <Button Template="{ StaticResource a}"></Button>

---(这样就可以保持和button按钮的值同步;)

 <ControlTemplate x:Name="a">

            <Grid>

                <Ellipse Width="100" Height="100" Fill="Red">

                </Ellipse>

                <TextBlock Text="{TemplateBinding Button.Content}" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>

            </Grid>

        </ControlTemplate>

---------绑定控件的content属性;所以这样就可以同步conent所有形式,比如在button按钮中放图片也可以;

   <Grid>

                <Ellipse Width="100" Height="100" Fill="Red">

                </Ellipse>

                <!--<TextBlock Text="{TemplateBinding Button.Content}" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>-->

                <ContentControl Content="{TemplateBinding Button.Content}"></ContentControl>

            </Grid>

------------控件绑定;

 <Slider Name="s1" Value="{Binding Text,ElementName=aa,Mode=TwoWay}">

----------------获取资源文件的类;相当于控制反转;

  Person p1 = (Person)this.Resources["cB"];cb是键值;

-----------------页面数据绑定(当页面需要随着model值变化)

(1)定义person类;(这两种都可以,建议是第二种)

(2)amespace PhoneApp1.bangding

{

    //public class Person : INotifyPropertyChanged

    //{

 

    //    #region INotifyPropertyChanged 成员

 

    //    public event PropertyChangedEventHandler PropertyChanged;

 

    //    #endregion

    //    private string name;

    //    public string Name

    //    {

    //        get { return name; }

    //        set

    //        {

    //            name = value;

    //            if (PropertyChanged != null)

    //            {

    //                PropertyChanged(this,new PropertyChangedEventArgs("Name"));name指的是属性name

    //            }

    //        }

    //    }

    //}

    public class Person : DependencyObject

    {

        //静态的,DependeycyPerty,属性名+property=属性名,属性类型,所属类,null);

        public static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Person), null);

        public string Name

        {

            get

            {

                return GetValue(NameProperty) as string;

            }

            set

            {

                SetValue(NameProperty, value);

            }

        }

        //自动生成(插入外侧代码,nf30,)

 

 

        public double MyProperty

        {

            get { return (double)GetValue(MyPropertyProperty); }

            set { SetValue(MyPropertyProperty, value); }

        }

 

        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty MyPropertyProperty =

            DependencyProperty.Register("MyProperty", typeof(double), typeof(ownerclass), new UIPropertyMetadata(0));

 

        

       

    }

}

(3)引入类

    xmlns:my="clr-namespace:PhoneApp1.bangding"

(4)放到资源中;

<phone:PhoneApplicationPage.Resources>

        <my:Person Name="cA" x:Key="cB"></my:Person>

    </phone:PhoneApplicationPage.Resources>

(5)引用资源:

    <TextBox Name="txtName" Text="{Binding Name}" DataContext="{StaticResource cB}">

            </TextBox>

--------------------------------------------- DataContext="{StaticResource cB}上下文可以设定到父节点上;

-----------绑定listbox有两种形式:

 InitializeComponent();

            List<Person> list = new List<Person>();

            list.Add(new Person {Name="郭泽峰",Age=22});

            list.Add(new Person { Name = "张三", Age = 22 });

            list.Add(new Person { Name = "李四", Age = 24 });

            //ltbData.ItemsSource = list;(1)

            ltbData.DataContext = list;(2)种类;这种需要添加;ItemsSource="{Binding}"

------------匿名委托:

  Thread t = new Thread(() => {

                this.Dispatcher.BeginInvoke(() => {

                    list.Add(new Person { Name = "郭泽峰", Age = 22 });

                });

                Thread.Sleep(1000);

                this.Dispatcher.BeginInvoke(() =>

                {

                    list.Add(new Person { Name = "郭泽峰", Age = 22 });

                });

t.start();

要想使控件随数据源动态源集合变化,必须使用其他集合:

using System.Collections.ObjectModel;

   private ObservableCollection<Person> list = new ObservableCollection<Person>();

 

------------知识点:

silverlight不能再非UI线程中访问UI线程控件,而机场自DependencyObject的类都是UI线程东西,并且访问

要使用:this.Dispatcher.BeginInvoke(()=>{ ....});

要要求集合的数据变化反应到ui上,必须实现InotifyCollectionChange接口;一般使用系统预定义的ObservableCollection类;

------------------------------------------------------------------------------------------------------------------

MVVM是Model-View-ViewModel的简写。

-------------绑定其他的事件:

(1)添加对程序集的引用

(2)xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

(3)<TextBlock  Foreground="Yellow" Text="点击事件(其它事件绑定案例)">

            <i:Interaction.Triggers>

                    <i:EventTrigger EventName="Tap">

                        <i:InvokeCommandAction Command="{Binding AddCmd}" CommandParameter="{Binding}">

                        </i:InvokeCommandAction>

                    </i:EventTrigger>

            </i:Interaction.Triggers>

  </TextBlock>

(4)后台代码不变;

---------------------数据转换

(1)

        public int Sex

        {

            get { return (int)GetValue(SexProperty); }

            set { SetValue(SexProperty, value); }

        }

        public static readonly DependencyProperty SexProperty =

        DependencyProperty.Register("Sex", typeof(int), typeof(Person), null);

(2)

 public class Conv:IValueConverter

    {

 

        #region IValueConverter 成员

 

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            //value为实体的属性值

            string a = value.ToString();

            if (a == "1")

                return "女";

            else

                return "男";

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            if (value.ToString() == "男")

                return 0;

            else

                return 1;

        }

        #endregion

    }

(3)

   <StackPanel>

            <ListBox Name="Li" ItemsSource="{Binding}">

                <ListBox.ItemTemplate>

                    <DataTemplate>

                        <TextBlock Text="{Binding Sex,Mode=TwoWay,Converter={StaticResource Con}}">

                        </TextBlock>

                    </DataTemplate>

            </ListBox.ItemTemplate>

   </ListBox>

------------------------------动画:

<phone:PhoneApplicationPage.Resources>

        <Storyboard x:Name="st">

            <DoubleAnimation Storyboard.TargetName="aa" Storyboard.TargetProperty="Angle"

                             From="0" To="360" AutoReverse="True" RepeatBehavior="Forever">

            </DoubleAnimation>

        </Storyboard>

    </phone:PhoneApplicationPage.Resources>

---------------------------------------------------

   <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">

            <Image Source="../捕获.PNG" Width="100" Height="100">

                <Image.RenderTransform>

                    <RotateTransform CenterX="0" CenterY="0" Angle="30" x:Name="aa">

                    </RotateTransform>

                </Image.RenderTransform>

            </Image>

   </StackPanel>

-----------------------------------------------------windowsphone:内核是底层:windowsCE;windowce-->windows mobel;

安卓:linux;

ios:unix;

windows phone和windows mobel是windows CE的两个分支;

------

 配置文件中<Capabilities>表示注册需要操作设备的权限;

 

---------------控制方向;

    SupportedOrientations="PortraitOrLandscape"  Orientation="Portrait"

会触发一个事件(前提SupportedOrientations="PortraitOrLandscape"才能出发)

 protected override void OnOrientationChanged(OrientationChangedEventArgs e)重写这个函数即可;

  this.SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;//这只方向;

设置按钮的显隐;

 

----------------------applicationbar最多放按钮放了4个,条目放50个;

图标大小和格式都有要求必须是png,且是48*48;开机画面图片名字不变;图片必须生成为内容,而不是资源,这点必须注意;

 

--------------applicationbar中的按钮和菜单是没法通过findName找到的;所以;ApplicationBar不是名字而是标签的名字;

  ApplicationBarIconButton bb = ApplicationBar.Buttons[1] as ApplicationBarIconButton;

  bb.IconUri = new Uri("/Img/appbar.cancel.rest.png",UriKind.Relative);

-------sip:softinputPanel;软件盘;

//通过这段代码可以找出所有类型 ;

 InputScopeNameValue.Number

//前台代码:

<TextBox Name="aa" InputScope="AddressCity"></TextBox>

 

----------------wp7:Coding4Fun.Toolkit.Controls;应用;

            //ToastPrompt tp = new ToastPrompt();

            //tp.Message = "你大爷的";

            //tp.Show();

            //messageprompt是一个异步的避免阻塞UI线程;

            MessagePrompt mp = new MessagePrompt();

            mp.IsCancelVisible = true;

            mp.Title = "确认删除吗";

            mp.Message = "哈哈哈";

            mp.Completed += new EventHandler<PopUpEventArgs<string, PopUpResult>>(mp_Completed);

            mp.Show();

 

            //MessageBoxResult result = MessageBox.Show("哈哈", "提示", MessageBoxButton.OKCancel);

            //if (result == MessageBoxResult.OK)

            //{

                  //最好不要再loaded内放入执行太长时间的代码,比如扫描文件,因为10秒钟后线程就会被干掉;

            //    MessageBox.Show("选择了ok");

            //}

            //else

            //{

            //    MessageBox.Show("选择了NO");

            //}

----------------------当listpiker项目比较多时items比较多时,就会报错;

 

------------在项目中一定要存在Toolkit.Content这个文件夹;因为一些控件会自动到这个文件家中去找相应图片,比如说确定,和取消按钮;

---WrapPanel:一次排列;实时上我们可以不用grid控件;

----菜单控件;需要长按textbox可以弹出;

  <TextBox Name="tt">

                <tk:ContextMenuService.ContextMenu>

                    <tk:ContextMenu>

                        <tk:MenuItem Header="菜单一"></tk:MenuItem>

                        <tk:MenuItem Header="菜单二"></tk:MenuItem>

                        <tk:MenuItem Header="菜单三"></tk:MenuItem>

                        <tk:MenuItem Header="菜单四"></tk:MenuItem>

                    </tk:ContextMenu>

                </tk:ContextMenuService.ContextMenu>

            </TextBox>

 

--------- 动态图片;

<tk:HubTile Message="哈哈" Notification="你大爷" Source="../Img/1.jpg">

               

            </tk:HubTile>

 

------using System.Windows.Controls.Primitives;(独立于页面)

  Popup pp = new Popup();

            Button btn = new Button();

            btn.Content = "你大爷的";

            pp.Child = btn;

            pp.IsOpen = true;

 

------选项卡尽量不要与applicationBar一起使用;需要添加microsoft.phone.controls;

<con:Pivot>

        <con:PivotItem Header="标题一">

            <StackPanel>

                <CheckBox Content="哈哈哈"></CheckBox>

                <CheckBox Content="哈哈哈"></CheckBox>

                <CheckBox Content="哈哈哈"></CheckBox>

            </StackPanel>

        </con:PivotItem>

        <con:PivotItem Header="标题二">

            <StackPanel>

                <CheckBox Content="哈哈哈"></CheckBox>

                <CheckBox Content="哈哈哈"></CheckBox>

                <CheckBox Content="哈哈哈"></CheckBox>

            </StackPanel>

        </con:PivotItem>

        <con:PivotItem Header="标题三">

            <StackPanel>

                <CheckBox Content="哈哈哈"></CheckBox>

                <CheckBox Content="哈哈哈"></CheckBox>

                <CheckBox Content="哈哈哈"></CheckBox>

            </StackPanel>

        </con:PivotItem>

    </con:Pivot>

 

---------------------独立存储

每个程序只能读取自己的文件夹,其它的程序不能读取;没有权限这样就防止了病毒;

需要引入命名控件

using System.IO.IsolatedStorage;//命名控件

(1)

  using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())

            {

                using (Stream str = file.CreateFile("a.txt"))

                {

                    using (StreamWriter sw = new StreamWriter(str))

                    {

                        sw.WriteLine(txtName.Text);

                    }

                }

            }

            //IsolatedStorageFileStream istr = new IsolatedStorageFileStream("Hellow\a.txt", FileMode.OpenOrCreate, file);

(2)

  IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();

            if (file.FileExists("a.txt"))

            using (Stream str = file.OpenFile("a.txt",FileMode.Open))

            {

                using (StreamReader sr=new StreamReader(str))

                {

                    string line = sr.ReadLine();

                    txtName.Text = line;

                }

            }

-----------------------

 IsolatedStorageSettings.ApplicationSettings["Name"] = txtName.Text;

 IsolatedStorageSettings.ApplicationSettings.Save();//别忘了保存

----

  if (IsolatedStorageSettings.ApplicationSettings.Contains("Name"))

 {

      txtName.Text = IsolatedStorageSettings.ApplicationSettings["Name"].ToString();

 }

------------------跳转页面需要从根目录开始

  NavigationService.Navigate(new Uri("/content/tiao2.xaml", UriKind.Relative));

NavigationService.Navigate(new Uri("/content/tiao2.xaml?name=guozefeng", UriKind.Relative));

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)

        {

            base.OnNavigatedTo(e);

            if (NavigationContext.QueryString["name"] != null)

            {

                string name = NavigationContext.QueryString["name"].ToString();

                MessageBox.Show(name);

            }

        }

----------------还有一种就是静态属性了;(如果比较数据类型复杂的话)

  if (NavigationService.CanGoForward)

            {

                NavigationService.GoForward();

            }

---------------已经退出触发的时间

  protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)

        {

            base.OnNavigatedFrom(e);

        }

  //将要退出;

        protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)

        {

            base.OnNavigatingFrom(e);

            messagebox.show("将要离开吗")==OK;

            e.cancel=false;//取消离开;

        }

//按返回键时。OnBackKeyPress

        protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)

        {

            base.OnBackKeyPress(e);

        }

-------------执行顺序:

 InitializeComponent();--->OnNavigatedTo--->最后才是page_loaded;

  if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)

            {

                //判断是不是首次加载,是的话,好初始化;避免了重复加载初始化,提高性能;

                //尽量将初始化的东西加载到onNavigatedTo中;

            }

--------------------文件为内容文件;

   private void du1_Click(object sender, RoutedEventArgs e)

        {

            StreamResourceInfo si = Application.GetResourceStream(new Uri("content/log.txt",UriKind.Relative));

            using (StreamReader sr = new StreamReader(si.Stream))

            {

                string str = sr.ReadToEnd();

                MessageBox.Show(str);

            }

        }

-----文件为资源;

        private void du2_Click(object sender, RoutedEventArgs e)

        {

            StreamResourceInfo si = Application.GetResourceStream(new Uri("/PhoneApp1;component/content/log1.txt",UriKind.RelativeOrAbsolute));

            using (StreamReader sr = new StreamReader(si.Stream))

            {

                string str = sr.ReadToEnd();

                MessageBox.Show(str);

            }

        }

-------翻页效果:

在主页面开始:

  <toolkit:TransitionService.NavigationInTransition>

        <toolkit:NavigationInTransition>

            <toolkit:NavigationInTransition.Backward>

                <toolkit:TurnstileTransition Mode="BackwardIn"/>

            </toolkit:NavigationInTransition.Backward>

            <toolkit:NavigationInTransition.Forward>

                <toolkit:TurnstileTransition Mode="ForwardIn"/>

            </toolkit:NavigationInTransition.Forward>

        </toolkit:NavigationInTransition>

    </toolkit:TransitionService.NavigationInTransition>

    <toolkit:TransitionService.NavigationOutTransition>

        <toolkit:NavigationOutTransition>

            <toolkit:NavigationOutTransition.Backward>

                <toolkit:TurnstileTransition Mode="BackwardOut"/>

            </toolkit:NavigationOutTransition.Backward>

            <toolkit:NavigationOutTransition.Forward>

                <toolkit:TurnstileTransition Mode="ForwardOut"/>

            </toolkit:NavigationOutTransition.Forward>

        </toolkit:NavigationOutTransition>

    </toolkit:TransitionService.NavigationOutTransition>

----(2)改app.xaml;

   // 创建框架但先不将它设置为 RootVisual;这允许初始

            // 屏幕保持活动状态,直到准备呈现应用程序时。

            //RootFrame = new PhoneApplicationFrame();

            RootFrame = new TransitionFrame();

--------发送短信:

using Microsoft.Phone.Tasks;//引用;

  SmsComposeTask sm = new SmsComposeTask();

            sm.To = "10086";

            sm.Body = "你好,你大爷的";

            sm.Show();

 

 

 

原文地址:https://www.cnblogs.com/guozefeng/p/3209323.html