Lc.exe已退出 代码为-1

问题描述:今天使用VS2010开发Jaguar,编译报错:"Lc.exe已退出 代码为-1 "

问题分析:在项目中增加了一个第三方组件,后来删除了,我的计算机上没有这个第三方组件,结果导致了LC.exe错误

问题解决
1、把项目文件夹下Properties文件夹下的licenses.licx文件删除,重新编译即可;
2、文本方式打开*.csproj文件,在文件中查找licenses.licx字样,删除对应节点。

注意:还有一种情况就是Properties文件夹下已经没有licenses.licx文件了,程序还是报这个错,这个时候你只需要重命名一个空的txt文件为licenses.licx再放入Properties文件夹,问题也可解决。

WPF中MediaElement的MediaOpened事件不触发

问题描述:今天做Jaguar。用的WPF框架,其中每个Page中有一个MediaElement,总是跳转不到第二个Page。但是在调试的时候加入断点,就可以。

问题分析
用断点查找,发现第二个Page的MediaElement的MediaOpened不触发导致的问题。
MediaElement的.xaml是这样定义的:
<MediaElement Name="mediaElement" Margin="0" MediaOpened="mediaElement_MediaOpened" MediaEnded="mediaElement_MediaEnded" LoadedBehavior="Manual" UnloadedBehavior="Manual" />
MediaElement的.xaml.cs是这样定义的:
mediaElement.Source = new Uri(source);
mediaElement.Stop();

把.xaml.cs改为:
mediaElement.pause();
无用。
把.xaml.cs改为:
mediaElement.play();
video倒是在后台播了,但是还是不触发MediaOpened。

随后查找资料:
MediaOpened: 当媒体流已被验证和打开且已读取文件头时发生。如果 AutoPlay 属性设置为 false,则当发生 MediaOpened 事件时,将暂停媒体。另外要注意: Position 属性在发生 MediaOpened 事件之前为 null。虽然 Position 是可设置的。但在引发 MediaOpened 事件之前,不应尝试设置 Position。包括不应在 XAML 中设置初始 Position 值。
把所有Opened之前的Position改掉,无用。
我彻底被打败了,只好跳过MediaOpened事件,直接把MediaElement加上去。

Kinect for developer

最近公司做Jaguar,用Kinect做互动。因为Developer版本的Kinect要贵,而且中国不销售,定85个来不及。所以每次调试VS都如下输出

The Kinect sensor plugged into your computer is for use on the Xbox 360.
You may continue using your Xbox 360 Kinect sensor on your computer for development purposes.
Microsoft does not guarantee full compatibility for Kinect for Windows applications and the Xbox 360 Kinect Sensor.

悲剧啊

WPF中Page类继承问题

问题描述:今天做Jaguar的Kinect互动,发现C#中Page继承失败。

问题解决
在cs文件中修改StartPage继承ContentPage。报如下错误:
 “Jaguar.Page.StartPage”的分部声明一定不能指定不同的基类。
应该是XAML自动生成的StartPage.g.cs里的基类没有改变。那么随后修改xaml文件中映射的类。又报如下错误:
 “Jaguar.Page.ContentPage”不能是 XAML 文件的根,因为它是使用 XAML 定义的。
原来要被继承就必须是只有cs文件,而没有xaml文件的。所以只能保留cs文件。把所有xaml定义的转到cs代码上。
问题终于解决了。别看VS方便,其实问题特多。

C#事件不能直接继承问题

问题描述:今天做Jaguar的Kinect互动,发现C#中事件一继承后就不能调用。

代码如下:
public class ContentPage : System.Windows.Controls.Page
{
public delegate void LoadCompletedHandle(object sender);
public event LoadCompletedHandle LoadCompleted;
}
public partial class StartPage : ContentPage
{
private void VideoPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
if (LoadCompleted != null)
{
LoadCompleted(this);
}
}
}

报错如下:
错误 1 事件“Jaguar.Page.ContentPage.LoadCompleted”只能出现在 += 或 -= 的左边(从类型“Jaguar.Page.ContentPage”中使用时除外) C:\Users\CouldHll\Desktop\Jaguar\Jaguar\Page\StartPage.xaml.cs 48 17 Jaguar

问题分析
事件只能从声明它们的类中调用,派生类不能直接调用在基类声明的事件。

要处理基类的事件,通常通过在基类中为事件创建受保护虚方法(OnEventName)来实现。派生类可以重写基类的OnEventName方法,也可以直接调用基类的OnEventName方法,从而实现调用基类的事件。重写基类的OnEventName方法,派生类可以截获基类正在调用的事件,对这些事件执行它自己的处理。

问题解决

代码如下:
protected virtual void OnLoadCompleted(object sender)
{
if (LoadCompleted != null)
{
this.LoadCompleted(sender);
}
}
private void VideoPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
OnLoadCompleted(this);
}