最近讲原wpf开发的项目转silverhight ,碰到个挠头的问题:wpf代码移植到silverhight后一直提示"值不在预期的范围内",在网上查了各种资料各种改,都无效,郁闷的要砸电脑!~
具体如下:
动态增加TabControl的选项卡TabItem,并填充label / image 等控件.
wpf中执行无问题,代码如下:
TabItem tt = new TabItem(); //TabItem
tt.IsSelected = isSelected;
tt.Header = this._title;
tt.Uid = tt.Name = "tab_" + this._id;
//动画形式显示
Viewbox _vb = new Viewbox(); //ViewBox元素可使子元素自动缩放
_vb.Name = "vbox_" + this._id;
_vb.Stretch = Stretch.Uniform;
tt.Content = _vb;
//添加容器Canvas
Canvas _c = new Canvas(); //Canvas
_c.Uid = _c.Name = "can_" + this._id;
_c.Width = 1280;
_c.Height = 720;
_vb.Child = _c;
//添加地图
Image _imgMap = new Image();
_imgMap.Name ="imgMap";
_imgMap.Source = BaseMethod.GetImage(this._mapPath);
_imgMap.ToolTip = _imgMap.Name;
//_imgMap.Stretch = Stretch.Uniform;
_imgMap.Width = _c.Width;
_imgMap.Height = _c.Height;
Canvas.SetLeft(_imgMap, 0);
Canvas.SetTop(_imgMap, 0);
_c.Children.Add(_imgMap);
//添加Element
this._elements.ForEach(delegate(MElement _el) {
if (null == _el.MyPoint)
{
_el.MyPoint = new Point(5, 5);
}
CElementUI _ceui = new CElementUI(_el);
_ceui.CEUDrawing(ref _c);
});
//创建动画计时器
#region 创建动画计时器
DispatcherTimer _AnimationTimer = new DispatcherTimer();
_AnimationTimer.Interval = TimeSpan.FromMilliseconds(150);
_AnimationTimer.Tick += new EventHandler(delegate(object sender, EventArgs e)
{
//各种状态下的颜色变换
this._elements.ForEach(AnimationChangeCEUIColor);
_bChangeColor = !_bChangeColor;
//变换图片(图片动画)
});
_AnimationTimer.Start();
#endregion
以上转为silverhight后,死活不行,无法创建tabitem以及控件.错误提示"值不在预期的范围内",详细如下:
位于 MS.Internal.XcpImports.MethodEx(IntPtr ptr, String name, CValue[] cvData)
位于 MS.Internal.XcpImports.MethodPack(IntPtr objectPtr, String methodName, Object[] rawData)
位于 MS.Internal.XcpImports.Collection_Add[T](PresentationFrameworkCollection`1 collection, Object value)
位于 System.Windows.PresentationFrameworkCollection`1.AddImpl(Object value)
位于 System.Windows.Controls.ItemCollection.AddImpl(Object value)
位于 System.Windows.Controls.ItemCollection.AddInternal(Object value)
位于 System.Windows.PresentationFrameworkCollection`1.Add(T value)
位于 PersonnelOrientation.MainPage..ctor()
**************************
查了N久,试了N多方法,都无效....苦恼,郁闷!~~ 无意中,一个小灵感却把问题解决了:所有的控件Name属性都加上个变量,保证不重复... 成功!
总结如下(未必正确,如有错误欢迎您指正):
wpf中动态向容器(Canvas等)添加控件时,不同容器中控件的name/uid等属性可以重复,如上面我的image控件name属性均为"imgMap",系统可以自动识别;而silverhight中却不可以,容器似乎无法标识其中的控件,因此任何控件的name属性必须无重复,在动态创建时,必须保证各控件name的唯一性,无论控件是否在同一容器中.
另:微软的大佬们,这个"值不在预期的范围内"的提示让人挠头哇,为了广大劳动人民,能给具体不
email: azjcdy@163.com