Silverlight用FindName搜索找不到控件名是怎么回事?(急)

heren5201314 2011-03-30 09:46:38
我用传参的方式传值:
Rectangle rt = FindName(myName + i) as Rectangle ,
想把找到的控件隐藏
但是rt有时候会出现异常(未将对象引用到对象的实例),找不到控件,值为null,但是有时候又是好的,没什么问题!
这是什么情况? 不明白。我rt是动态命名:如下。
if (listTak.ElementAt(i).NumSleep == 1)
{
re.Name = "rtSleeping" + i;
re.Fill = new SolidColorBrush(Colors.Blue);
myTitle = "熟睡";
}
else if (listTak.ElementAt(i).NumSleep == 2)
{
re.Name = "rtShallow" + i;
re.Fill = new SolidColorBrush(Colors.Orange);
myTitle = "浅睡";
}
else if (listTak.ElementAt(i).NumSleep == 3)
{
re.Name = "rtDreaming" + i;
re.Fill = new SolidColorBrush(Colors.Red);
myTitle = "做梦";
}
else if (listTak.ElementAt(i).NumSleep == 4)
{
re.Name = "rtSop" + i;
re.Fill = new SolidColorBrush(Colors.Green);
myTitle = "疑似呼吸中止症";
}
实在想不懂,请各位帮帮忙!
...全文
500 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
heren5201314 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengyi_205 的回复:]
C# code

#region 控件查询
/// <summary>
/// 查询指定的子控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param n……
[/Quote]

我用了你的方法,一样,有时候还是会出现控件找不到的问题,并且你方法性能太差!
heren5201314 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengyi_205 的回复:]
C# code

#region 控件查询
/// <summary>
/// 查询指定的子控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param n……
[/Quote]
那个DependencyObject obj,我应该传什么参数过去啊?不太明白什么意思!
heren5201314 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pan1001 的回复:]
動態建立出來的物件 . 假設放入 Canvas 中顯示
所以會 加入到 Canvas.Children

之後 在使用 foreach 逐一查找 , 應該就不會錯了 . 除非沒有加入
[/Quote]
我虽然没有加入到Canvas中,但是我加入到了StackPanel中了,并且在页面都显示出来了,就是查找的时候不到控件!
heren5201314 2011-03-31
  • 打赏
  • 举报
回复
谢谢各位帮忙了,原来我的查找控件的方法没问题,问题在于我命名的时候调用了两次WebService导致生出来的数据不一样,因为WebService写的是随机数,所以命名出来不一样,错误!!!总之谢谢各位的热心帮忙!
hhddzz 2011-03-31
  • 打赏
  • 举报
回复
SL不清楚
WPF里要调用UIElement.RegisterName之后才能用FindName找
heren5201314 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pan1001 的回复:]
你 這 四個 Rectangle 是 動態建立的 嗎? 且 你確定 物件都已建立.

在 MSDN 中有 提到 不建議 修改 於 XAML 檔案 中 使用 物件的 Name .

參考資料 : 此文件中有提到 FindName() 會有找不到 物件 的 情況.
http://msdn.microsoft.com/zh-tw/library/system.windows.framewo……
[/Quote]
都是动态建立的,因为我后面要查找该控件,所以只能在代码的执行阶段给他设定Name(以后要搜索该控件,隐藏该控件) 名称都具有唯一性,UI页面中没有类似的名称。页面有时候运行没问题,有时候却有问题。请问什么情况?
pan1001 2011-03-30
  • 打赏
  • 举报
回复
你 這 四個 Rectangle 是 動態建立的 嗎? 且 你確定 物件都已建立.

在 MSDN 中有 提到 不建議 修改 於 XAML 檔案 中 使用 物件的 Name .

參考資料 : 此文件中有提到 FindName() 會有找不到 物件 的 情況.
http://msdn.microsoft.com/zh-tw/library/system.windows.frameworkelement.name(VS.95).aspx

以程式碼設定名稱
雖然您可以在程式碼中設定名稱,但是通常不建議您在程式碼的執行階段設定 Name。這是因為在載入物件樹狀結構後設定名稱,將不會建立對等的欄位參考。如果因為初始標記中有提供 Name 而已經存在欄位參考,而且您變更 Name 的值,則您在透過 FindName 尋找物件時所需要使用的欄位和名稱現在就會不同,因為該欄位仍維持為標記定義的名稱。有個可能適合設定 Name 的案例,例如,您在程式碼中透過建構函式 (或其他方法呼叫) 建立物件,並在將其加入至主要物件樹狀結構後,想要提供物件名稱以尋找該物件時 (運用 FindName)。

heren5201314 2011-03-30
  • 打赏
  • 举报
回复
来人帮忙啊,提了几个问题CSDN都无音讯,怎么回事?
夺命胖子 2011-03-30
  • 打赏
  • 举报
回复

#region 控件查询
/// <summary>
/// 查询指定的子控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="name"></param>
/// <returns></returns>
public static T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
T grandChild = null;

for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);

if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
{
return (T)child;
}
else
{
grandChild = GetChildObject<T>(child, name);
if (grandChild != null)
return grandChild;
}
}
return null;
}
#endregion


网上找的,我用的这个
pan1001 2011-03-30
  • 打赏
  • 举报
回复
動態建立出來的物件 . 假設放入 Canvas 中顯示
所以會 加入到 Canvas.Children

之後 在使用 foreach 逐一查找 , 應該就不會錯了 . 除非沒有加入
heren5201314 2011-03-30
  • 打赏
  • 举报
回复
谁可以再帮助下?

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧