C# 我正在尝试加载xaml并从应用程序运行其动画
我正在开发一个wpf应用程序,它可以加载几个用blend制作的xaml文件。我的应用程序必须单独运行xaml的动画。我已经进行了解析,创建了usercontrol,创建了stroryboards,并将xaml放入usercontrol中。我的问题是我无法运行从xaml获取并添加到userControl的动画 此外,我放置代码:C# 我正在尝试加载xaml并从应用程序运行其动画,c#,wpf,xaml,C#,Wpf,Xaml,我正在开发一个wpf应用程序,它可以加载几个用blend制作的xaml文件。我的应用程序必须单独运行xaml的动画。我已经进行了解析,创建了usercontrol,创建了stroryboards,并将xaml放入usercontrol中。我的问题是我无法运行从xaml获取并添加到userControl的动画 此外,我放置代码: private void FillMenuWindow(ScreeningArea area) { string lData = null;
private void FillMenuWindow(ScreeningArea area)
{
string lData = null;
bool isCanvasAdded = false;
UserControl menuUserControl = new UserControl();
Canvas XAMLWindowCanvas = new Canvas();
XDocument xmlFile = new XDocument();
IEnumerable<XElement> elementList;
MemoryStream stream = null;
int initSide = 0;
menuStoryboardList.Clear();
if (area.CurrentItem != null)
{
SimpleDelegate resumedDelegate = delegate
{
string nameCounter;
string myStream;
string mystrName;
xmlFile = XDocument.Load(VideoMenuSystem.DataPath + "\\" + area.CurrentItem.ItemName + ".xaml");
StreamReader menuReader = new StreamReader(VideoMenuSystem.DataPath + "\\" + area.CurrentItem.ItemName + ".xaml");
myStream = menuReader.ReadToEnd();
TextToFile(myStream, VideoMenuSystem.DataPath + "\\" + "xamlFile.txt",false);
menuUserControl = new UserControl();
//this.RegisterName("Test", menuUserControl);
elementList = xmlFile.Root.Descendants();
foreach (XElement el in elementList)
{
mystrName = el.Name.LocalName;
switch (mystrName)
{
case "Storyboard":
lData = el.ToString();
TextToFile(lData, VideoMenuSystem.DataPath + "\\" + "storyBoardFile.txt", true);
stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(lData));
myStoryboard.Children.Add(XamlReader.Load(stream) as Storyboard);
break;
case "Canvas":
lData = el.ToString();
if (lData != null)
{
stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(lData));
XAMLWindowCanvas.Children.Add(XamlReader.Load(stream) as UIElement);
foreach (ScreeningArea sa in Screens)
{
if (sa == area)
{
initSide = menuSize.Width + screenSeparator;
break;
}
}
XAMLWindowCanvas.Margin = new Thickness(left, 0, 0, 0);
menuUserControl.Content = XAMLWindowCanvas;
left += initSide;
}
isCanvasAdded = true;
break;
}
if (isCanvasAdded)
break;
}
nameCounter = DateTime.Now.Ticks.ToString();
String myNameCounter = nameCounter.Substring(nameCounter.Length - 10);
menuUserControl.Resources.Add("SB_" + myNameCounter, myStoryboard);
menuStoryboardList.Add(myStoryboard);
playbackArea.Children.Add(menuUserControl);
playbackArea.Loaded += new RoutedEventHandler(fireAnimation);
};
Dispatcher.BeginInvoke(resumedDelegate);
}
}
private void FillMenuWindow(筛选区域)
{
字符串lData=null;
bool isCanvasAdded=false;
UserControl menuUserControl=新建UserControl();
Canvas XAMLWindowCanvas=新画布();
XDocument xmlFile=新XDocument();
IEnumerable元素列表;
MemoryStream stream=null;
int initSide=0;
menuStoryboardList.Clear();
如果(area.CurrentItem!=null)
{
SimpleDelegate ResumeDelegate=委托
{
字符串名称计数器;
字符串myStream;
字符串mystrName;
xmlFile=XDocument.Load(VideoMenuSystem.DataPath+“\\”+area.CurrentItem.ItemName+“.xaml”);
StreamReader menuReader=新的StreamReader(VideoMenuSystem.DataPath+“\\”+area.CurrentItem.ItemName+“.xaml”);
myStream=menuReader.ReadToEnd();
TextToFile(myStream,videomenussystem.DataPath+“\\”+“xamlFile.txt”,false);
menuUserControl=新用户控件();
//此注册表名(“测试”,菜单控件);
elementList=xmlFile.Root.subjects();
foreach(元素列表中的元素el)
{
mystrName=el.Name.LocalName;
交换机(mystrName)
{
案例“情节提要”:
lData=el.ToString();
TextToFile(lData,videomenussystem.DataPath+“\\”+“storyBoardFile.txt”,true);
stream=newmemoryStream(System.Text.Encoding.UTF8.GetBytes(lData));
myStoryboard.Children.Add(XamlReader.Load(stream)作为故事板);
打破
案例“画布”:
lData=el.ToString();
如果(lData!=null)
{
stream=newmemoryStream(System.Text.Encoding.UTF8.GetBytes(lData));
XAMLWindowCanvas.Children.Add(XamlReader.Load(stream)作为UIElement);
foreach(屏幕中的屏幕区域sa)
{
如果(sa==面积)
{
initSide=menuSize.Width+屏幕分隔符;
打破
}
}
XAMLWindowCanvas.Margin=新厚度(左、0、0、0);
menuUserControl.Content=XAMLWindowCanvas;
左+=左侧;
}
isCanvasAdded=true;
打破
}
如果(已添加)
打破
}
nameCounter=DateTime.Now.Ticks.ToString();
字符串myNameCounter=nameCounter.Substring(nameCounter.Length-10);
menuUserControl.Resources.Add(“SB_”+mynameccounter,myStoryboard);
menuStoryboardList.Add(myStoryboard);
playbackArea.Children.Add(menuUserControl);
playbackArea.Loaded+=新的RoutedEventHandler(fireAnimation);
};
调度员开始通话(恢复通话);
}
}
我发现问题在于,当我向UserControl添加情节提要和画布时,它们不在同一范围内,这就是为什么情节提要找不到要设置动画的对象的原因。我重新编写代码,试图订购和修复它,但没有成功!这是新代码:
private UserControl ReadMenuObj(ScreeningArea area)
{
bool isCanvasAdded = false;
int initSide = 0;
string myStream;
string mystrName;
string nameCounter;
string lData = null;
UserControl localUC = new UserControl();
XDocument xmlFile = new XDocument();
Storyboard localSB = new Storyboard();
Canvas XAMLWindowCanvas = new Canvas();
IEnumerable<XElement> elementList;
StreamReader menuReader;
MemoryStream stream = null;
xmlFile = XDocument.Load(VideoMenuSystem.DataPath + "\\" + area.CurrentItem.ItemName + ".xaml");
menuReader = new StreamReader(VideoMenuSystem.DataPath + "\\" + area.CurrentItem.ItemName + ".xaml");
myStream = menuReader.ReadToEnd();
TextToFile(myStream, VideoMenuSystem.DataPath + "\\" + "xamlFile.txt", false);
elementList = xmlFile.Root.Descendants();
myStoryboard = new Storyboard();
foreach (XElement el in elementList)
{
mystrName = el.Name.LocalName;
switch (mystrName)
{
case "Storyboard":
lData = el.ToString();
TextToFile(lData, VideoMenuSystem.DataPath + "\\" + "storyBoardFile.txt", true);
stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(lData));
localSB = XamlReader.Load(stream) as Storyboard;
for (int i = 0; i < localSB.Children.Count; i++)
{
Timeline tm = (Timeline)localSB.Children.ElementAt(i);
myStoryboard.Children.Add(tm);
}
//myStoryboard.Children.Add(localSB);
break;
case "Canvas":
lData = el.ToString();
XAMLWindowCanvas = new Canvas();
if (lData != null)
{
TextToFile(lData, VideoMenuSystem.DataPath + "\\" + "xamlFile2.txt", true);
stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(lData));
DependencyObject rootObject = XamlReader.Load(stream) as DependencyObject;
XAMLWindowCanvas = rootObject as Canvas;
//XAMLWindowCanvas.Children.Add(XamlReader.Load(stream) as UIElement);
foreach (ScreeningArea sa in Screens)
{
if (sa == area)
{
initSide = menuSize.Width + screenSeparator;
break;
}
}
XAMLWindowCanvas.Margin = new Thickness(left, 0, 0, 0);
//XAMLWindowCanvas.Loaded += new RoutedEventHandler(fireAnimation);
XAMLWindowCanvas.MouseDown += new MouseButtonEventHandler(fireAnimation);
localUC.Content = XAMLWindowCanvas;
int cnvConut = XAMLWindowCanvas.Children.Count;
left += initSide;
}
isCanvasAdded = true;
break;
}
if (isCanvasAdded)
break;
}
menuStoryboardList.Add(myStoryboard);
nameCounter = DateTime.Now.Ticks.ToString();
String myNameCounter = nameCounter.Substring(nameCounter.Length - 10);
localUC.Resources.Add( "SB_" + myNameCounter, myStoryboard);
Canvas cnv = (Canvas)localUC.FindName("Combo_3");
Storyboard storyboard = (Storyboard)localUC.Resources["CombonAnim"];
return localUC;
}
private UserControl ReadMenuObj(屏幕区域)
{
bool isCanvasAdded=false;
int initSide=0;
字符串myStream;
字符串mystrName;
字符串名称计数器;
字符串lData=null;
UserControl localUC=new UserControl();
XDocument xmlFile=新XDocument();
情节提要localSB=新情节提要();
Canvas XAMLWindowCanvas=新画布();
IEnumerable元素列表;
StreamReader菜单阅读器;
MemoryStream stream=null;
xmlFile=XDocument.Load(VideoMenuSystem.DataPath+“\\”+area.CurrentItem.ItemName+“.xaml”);
menuReader=new StreamReader(VideoMenuSystem.DataPath+“\\”+area.CurrentItem.ItemName+”.xaml);
myStream=menuReader.ReadToEnd();
TextToFile(myStream,videomenussystem.DataPath+“\\”+“xamlFile.txt”,false);
elementList=xmlFile.Root.subjects();
myStoryboard=新故事板();
foreach(元素列表中的元素el)
{
mystrName=el.Name.LocalName;
交换机(mystrName)
{
案例“情节提要”:
lData=el.ToString();
TextToFile(lData,videomenussystem.DataPath+“\\”+“storyBoardFile.txt”,true);
stream=newmemoryStream(System.Text.Encoding.UTF8.GetBytes(lData));
localSB=XamlReader.Load(stream)作为情节提要;
for(int i=0;i