0%

如果在线程中操作创建一个SolidColorBrush对象,系统会抛出System.UnauthorizedAccessException异常,提示Invalid cross-thread access,可以使用Dispatcher类的BeginInvoke方法解决 。 原代码:

S.Color = new SolidColorBrush(Colors.Red);
//在非UI线程中执行会抛异常

改成:

 Dispatcher.BeginInvoke(() => S.Color = new SolidColorBrush(Colors.Red));

当然,您可以选择加一个MediaElement控件,但是,您还需要自己添加播放,前进,后退,以及进度条等控件,最后再 把程序设为全屏,挺麻烦的。其实如果你需要的只是一个全屏播放的功能,用MediaPlayerLauncher就可以实现。MediaPlayerLauncher会新开一个全屏窗口来播放视频,播放、暂停、快递、快退、显示进度,一应俱全,唯一的缺点就是不能拖进度条。效果跟用Zune播放视频一样。

            MediaPlayerLauncher mediaPlayerLauncher = new MediaPlayerLauncher();
            mediaPlayerLauncher.Media = new Uri("http://vhotwsh.video.qq.com/flv/22/192/8lOTGS4bgMU.mp4?vkey=6F24E91E3DFBD19C2722B1CD2E217E0395477190191FA5ED1818F62BADAE2149", UriKind.Absolute);
            mediaPlayerLauncher.Location = MediaLocationType.Data;
            mediaPlayerLauncher.Controls = MediaPlaybackControls.Pause | MediaPlaybackControls.Stop;
            mediaPlayerLauncher.Show();

同样适用于SQL CE,数据大时,加速效果明显 CREATE NONCLUSTERED INDEX 索引名 ON 表名(列名)

PreferenceActivity的XML中主要有7种元素,分别是PreferenceScreen(根元素),CheckBoxPreference(CheckBox选项,如系统设置-无线网络里的飞行模式),EditTextPreference(弹出一个EditText),ListPreference(弹出一个选择列表),Preference(只显示文本,需要在代码中添加点击事件),PreferenceCategory(分组标题栏),RingtonePreference(铃声设置)。 下面写个小例子: 添加类型为Preference的xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="播放设置">
        <ListPreference android:title="播放服务器" android:summary="设置默认播放服务器,默认为1号服务器" android:entries="@array/server" android:entryValues="@array/server"
            android:dialogTitle="选择播放服务器" android:key="server_list">
        </ListPreference>
        <ListPreference android:title="播放模式" android:summary="模式1不支持MoboPlayer" android:entries="@array/play_mode" android:entryValues="@array/mode_value"
            android:dialogTitle="选择播放服务器" android:key="play_mode">
        </ListPreference>
        <ListPreference android:title="播放器" android:summary="设置默认播放器" android:dialogTitle="选择已安装播放器" android:key="player">
        </ListPreference>

    </PreferenceCategory>
    <PreferenceCategory android:title="帮助">
        <Preference android:title="查看帮助" android:summary="如果您有问题,请先查看帮助" android:key="help" />
    </PreferenceCategory>
    <PreferenceCategory android:title="反馈">
        <Preference android:title="用户反馈" android:summary="您对我们有什么意见,可以联系我们" android:key="feedback" />
    </PreferenceCategory>
</PreferenceScreen>

android:title即大号字体显示的标题,android:summary即短描述,android:key即保存该值的key,对ListPreference而言,还有android:entries,android:entryValues分别是显示的列表数据,和保存的值。 其中第三个ListPreference并没有设置android:entries,android:entryValues,我们将在Java代码中设置。

public class Setting extends PreferenceActivity {
    Dialog dialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setting);
        dialog=new Dialog(this);
        //自己写的用于执行相应操作的类
        ListPreference pre=(ListPreference)findPreference("player");
        pre.setEntries(new CharSequence[]{"Moboplayer","Vplayer","RockPlayer"});
        pre.setEntryValues(new CharSequence[]{"0","1","2"});
        //动态设置ListPreference
        
    }



    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        // TODO Auto-generated method stub
        String key=preference.getKey();
        //根据被点击项的key执行相应操作
        if(key.equals("help"))
        {
            dialog.showHelp();
        }
        if(key.equals("feedback"))
        {
            dialog.feedBack();
        }
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

}

Windows Phone从7.1开始支持本地数据库,是SQL CE,但是不支持直接使用SQL语句操作,需要用到Linq.因为网上例子比较少,而且都使用MVVM模式,对于我这个学C#没几天的人来说,太复杂了。折腾了一天,总算是搞定,上范例截图: 稍微解说一下,首先需要添加引用System.Data.Linq,再针对你的表定义一个类.我的表名为train,有三个字段,分别为id,train_no,favorite,定义如下:

 [Table]
    public class train : INotifyPropertyChanged, INotifyPropertyChanging
    {
        //类名与表名相同
        //给表定义一个类,包括所有的字段
        private int id;
        //字段名
        [Column(IsPrimaryKey = true, CanBeNull = false, IsDbGenerated = true, DbType = "INT NOT NULL Identity", AutoSync = AutoSync.OnInsert)]
        //主键,不为空,自动生成,int型不为空,仅在插入时返回值
        public int ID
        {
            get
            {
                return id;
            }
            set
            {
                if (id != value)
                {
                    //修改发送通知
                    NotifyPropertyChanging("ID");
                    id = value;
                    NotifyPropertyChanged("ID");
                }

            }
        }

        private string train_no;
        [Column]
        public string Train_no
        {
            get
            {
                return train_no;
            }
            set
            {
                NotifyPropertyChanging("Train_no");
                train_no = value;
                NotifyPropertyChanged("Train_no");
            }
        }

        private int favorite;
        [Column (DbType = "INT NOT NULL")]
        public int Favorite
        {
            get
            {
                return favorite;
            }
            set
            {
                NotifyPropertyChanging("Favorite");
                favorite = value;
                NotifyPropertyChanged("Favorite");
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }


        //通知修改
        public event PropertyChangingEventHandler PropertyChanging;

        private void NotifyPropertyChanging(string propertyName)
        {
            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
            }
        }

       
        public override string ToString()
        {
            return this.ID.ToString() + "," + this.Train_no + " ," + this.Favorite ;
        }
    }

再定义一个继承自 DataContext的DBContext类用于操作数据库:

    public class DBContext : DataContext
    {
        private const string DBPath = "Data Source=isostore:/db.sdf";
        //定义数据库路径
        public Table Train;
        //定义train表
        public DBContext(): base(DBPath)
        {
            //直接调用父类的构造方法
        }
        
    }

下面就是程序中的增删改查了:

namespace LocalDB
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        DBContext db;
        public ObservableCollection Items { get; private set; }
        public MainPage()
        {
            InitializeComponent();
        }

        private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            //页面载入时初始化
            db = new DBContext();
            if (!db.DatabaseExists())
                db.CreateDatabase();
            //数据库不存在就创建数据库


        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //增
            train t = new train();
            t.Train_no = "aaasf";
            t.Favorite = 1;
            db.Train.InsertOnSubmit(t);
            db.SubmitChanges();
            //提交修改
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //查
            var rows = from z in db.Train where z.ID>0&&z.ID<20 select z;
            //相当于select * from train,限定条件参考删、改
            textBlock1.Text = "";
            foreach (train t in rows)
            {
                textBlock1.Text += t.Train_no + "\n";
            }
        }


        private void button3_Click(object sender, RoutedEventArgs e)
        {
            //改
            var rows = from z in db.Train where z.Train_no == "aaasf" select z;
            //相当于select * from train where train_no="aaasf";
            //选出对象,再修改,没有update方法
            foreach (train mt in rows)
            {
                mt.Favorite = 1;
                mt.Train_no = "fsa";

            }
            db.SubmitChanges();


        }

        private void button4_Click(object sender, RoutedEventArgs e)
        {
            //删
            var rows = from z in db.Train where z.Train_no == "fsa" select z;
            //相当于select * from train where train_no="fsa"
            //先选出对象,再删除没有直接的delect方法
            foreach (train mt in rows)
            {
                db.Train.DeleteOnSubmit(mt);
            }
            db.SubmitChanges();
        }
    }
}

最后附上打包的源代码: [download id=”29”]

如果用户手机上装了多个播放器(如RockPlayer,VPlayer),但是我们需要指定用RockPlayer来打开我们的视频文件,可以用下面的方法实现:

Intent i = new Intent();
i.setComponent(new ComponentName("com.redirectin.rockplayer.android.unified", "com.redirectin.rockplayer.android.OpenRockPlayerActivity"));
//包名 类名,可以用APKTool反编译apk包,查AndroidManifest.xml
Uri name = Uri.parse("http://192.168.1.129/1.f4v");
i.setData(name);
startActivity(i);

ArrayList list=new ArrayList();
list.add("a");
list.add("b");

如上的ArrayList,调用其toArray()方法返回的是Object数组,如果需要得到String数组,可以给toArray()方法添加参数:

String[] s=list.toArray(new String[list.size()]);
for(String a:s)
{
System.out.println(a);
}

出现这个错误,是因为我在安装Windows Phone SDK后,自己又下载安装了Expression Blend 4 中文旗舰版,而expression blend 4是在windows phone SDK发布之前发布的,自然没有带Windows Phone的模板。解决方法很简单,下载安装Microsoft Expression Blend 4 Service Pack 1 (SP1)即可。Expression Blend 4 Service Pack 1 (SP1) 支持编译 Windows Phone 7 应用程序,并通过支持 FXG 文件格式改善了与 Adobe 设计工具之间的集成,另外还包含错误修补程序和增强稳定性的功能。

C#不能直接使用Sqlite数据库,需要安装第三方包,这里以ADO.NET 2.0 Provider for SQLite为例。ADO.NET 2.0 Provider for SQLite需要使用.Net FrameWork 2.0版,4.0版会报错。 安装后添加引用System.Data.SQLite,

            SQLiteConnection connection = new SQLiteConnection("Data Source=a.db");
            //连接
            connection.Open();
            //打开
            SQLiteCommand slCmd = new SQLiteCommand(connection);
            slCmd.CommandText = "select train_no from train";
            SQLiteDataReader reader = slCmd.ExecuteReader();
            //执行 sql并返回DataReader
            while (reader.Read())
            {
                Console.WriteLine(reader.GetString(0));
            }
            //转换train表

            reader.Close();
            //关闭DataReader
            connection.Clone();
            //关闭连接