成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C#WPF父控件通過(guò)使用可視化樹找到子控件的示例代碼

在我們使用WPF設(shè)計(jì)前臺(tái)界面時(shí),經(jīng)常會(huì)重寫數(shù)據(jù)模板,或者把控件放到數(shù)據(jù)模板里。但是一旦將控件放到數(shù)據(jù)模板中,在后臺(tái)就沒(méi)有辦法通過(guò)控件的名字來(lái)獲取它了,更沒(méi)辦法對(duì)它進(jìn)行操作(例如,隱藏,改變控件的某個(gè)值)。

創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元兗州做網(wǎng)站,已為上家服務(wù),為兗州各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

如果你是比我還白的小白,對(duì)我剛剛陳述的東西不清楚,接下來(lái)我簡(jiǎn)單說(shuō)一下什么是把控件放在數(shù)據(jù)模板中,怎么樣的情況沒(méi)法后臺(tái)通過(guò)名字來(lái)獲取控件,如果讀者對(duì)于數(shù)據(jù)模板這些事兒已經(jīng)清楚了,或者只關(guān)心如何使用可視化樹可以將這部分跳過(guò)哈。

先上代碼介紹一下什么是數(shù)據(jù)模板以WPF中ListBox控件為例:

<ListBox Name="ListBox_1" HorizontalAlignment="Left" Height="299" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" MouseDoubleClick="ListBox_1_OnMouseDoubleClick">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <Button Name="Button_1" Content="666"></Button>
      </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我在后臺(tái)設(shè)置了顯示了8行item,效果如下:

C# WPF 父控件通過(guò)使用可視化樹找到子控件的示例代碼

我們可以看到重寫數(shù)據(jù)模板實(shí)現(xiàn)的效果是在ListBox的每一項(xiàng)Item都是一個(gè)Button,這里介紹的只是一些簡(jiǎn)單應(yīng)用例子,重寫模板是很強(qiáng)大的。因?yàn)槿绻玫娇梢暬瘶涠喟胧且驗(yàn)槭褂昧藬?shù)據(jù)模板在后臺(tái)用名字無(wú)法找到相應(yīng)控件了,所以在此簡(jiǎn)單介紹一下,方便理解。

接下來(lái)我們?cè)诤笈_(tái)嘗試通過(guò)控件的名字來(lái)找到我們的ListBox和Button

C# WPF 父控件通過(guò)使用可視化樹找到子控件的示例代碼

C# WPF 父控件通過(guò)使用可視化樹找到子控件的示例代碼

我們發(fā)現(xiàn)通過(guò)控件的名字可以找到ListBox但是通過(guò)button的名字卻無(wú)法找到button,這就是數(shù)據(jù)模板搞的鬼。

但是沒(méi)有關(guān)系,我們可以通過(guò)可視化樹從ListBox里找到它的子控件我們想要的這個(gè)Button。

重點(diǎn)來(lái)了,先上代碼,可視化樹通過(guò)父控件找到它的子控件:

List<T> FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
    {
      try
      {
        List<T> list = new List<T>();
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
          DependencyObject child = VisualTreeHelper.GetChild(obj, i);
          if (child is T)
          {
            list.Add((T)child);
            List<T> childOfChildren = FindVisualChild<T>(child);
            if (childOfChildren != null)
            {
              list.AddRange(childOfChildren);
            }
          }
          else
          {
            List<T> childOfChildren = FindVisualChild<T>(child);
            if (childOfChildren != null)
            {
              list.AddRange(childOfChildren);
            }
          }
        }
        return list;
      }
      catch (Exception)
      {
        //MessageBox.Show(ee.Message);
        return null;
      }
    }

先將上面的方法復(fù)制到你的項(xiàng)目當(dāng)中,此時(shí)對(duì)于可視化樹的應(yīng)用已經(jīng)完成一半了。

接下來(lái)上代碼,通過(guò)可視化樹雙擊ListBox的ltem把對(duì)應(yīng)的button的Content值從666改成777:

C# WPF 父控件通過(guò)使用可視化樹找到子控件的示例代碼

private void ListBox_1_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
      ListBoxItem myListBoxItem = (ListBoxItem)ListBox_1.ItemContainerGenerator.ContainerFromItem(ListBox_1.SelectedItem);
      List<Button> btnList = FindVisualChild<Button>(myListBoxItem);
      foreach (var item in btnList)
      {
        item.Content = "777";
      }
    }

效果就是雙擊哪個(gè)item哪個(gè)item中的button從666變成了777。

我們通過(guò)父控件找到了里面的子控件button,我們便可以對(duì)它進(jìn)行任何操作(和用名字找到是一樣的)。

以上關(guān)于可視化樹的代碼可以應(yīng)用于ListBox,DataGrid,ListView,TreeView,對(duì)于“.ItemContainerGenerator.ContainerFromItem”這段代碼的含義我暫時(shí)不是很理解,歡迎指教和交流。

通過(guò)以上的例子相信讀者已經(jīng)可以使用可視化樹找到相應(yīng)的控件了,但在我的開發(fā)過(guò)程中曾遇到過(guò)一些問(wèn)題,和對(duì)于使用可視化樹的一點(diǎn)小建議。

1.如果你在使用可視化樹執(zhí)行“ListBoxItem myListBoxItem = (ListBoxItem)ListBox_1.ItemContainerGenerator.ContainerFromItem(ListBox_1.SelectedItem);”這句返回值是空(實(shí)際上不是空),可能是因?yàn)榻缑鏇](méi)有初始化完畢,我的理解是,在前臺(tái)這個(gè)控件還沒(méi)生成完畢,或者是你修改了值但前臺(tái)還沒(méi)有修改,可以加上這句:

控件名.UpdateLayout();

之后在使用可視化樹,這一條的說(shuō)法和形容可能有點(diǎn)不嚴(yán)謹(jǐn),歡迎指正交流。

2.可視化樹使用的是遞歸的方法,所以它的效率不是很高,如果在程序中大量使用可視化樹,會(huì)使得程序變慢的。

3.調(diào)用可視化樹返回的列表如果沒(méi)有找到相應(yīng)的控件或是異常便會(huì)返回空值,所以建議在你遍歷可視化樹返回的列表時(shí),請(qǐng)先判斷否非為空。

補(bǔ)充:WPF查找子控件和父控件方法

一、查找某種類型的子控件,并返回一個(gè)List集合
public List<T> GetChildObjects<T>(DependencyObject obj, Type typename) where T : FrameworkElement
{
DependencyObject child = null;
List<T> childList = new List<T>();
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).GetType() == typename))
{
childList.Add((T)child);
}
childList.AddRange(GetChildObjects<T>(child,typename));
}
return childList;
}
調(diào)用:
List<Button> listButtons = GetChildObjects<Button>(parentPanel, typeof(Button)); //parentPanel就是xaml里定義的控件的x:name
二、通過(guò)名稱查找子控件,并返回一個(gè)List集合
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
List<T> childList = new List<T>();
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).GetType() == name |string.IsNullOrEmpty(name)))
{
childList.Add((T)child);
}
childList.AddRange(GetChildObjects<T>(child,name));
}
return childList;
}
調(diào)用:
List<Button> listButtons = GetChildObjects<Button>(parentPanel, "button1");
三、通過(guò)名稱查找某子控件:
public 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;
}
}
returnnull;
}
調(diào)用:
StackPanel sp = GetChildObject<StackPanel>(this.LayoutRoot, "spDemoPanel");
四、通過(guò)名稱查找父控件
public T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject parent = VisualTreeHelper.GetParent(obj);
while (parent != null)
{
if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
{
return (T)parent;
}
parent = VisualTreeHelper.GetParent(parent);
}
returnnull;
}
調(diào)用:
Grid layoutGrid = VTHelper.GetParentObject<Grid>(this.spDemoPanel, "LayoutRoot");

總結(jié)

以上所述是小編給大家介紹的C# WPF 父控件通過(guò)使用可視化樹找到子控件,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!

新聞名稱:C#WPF父控件通過(guò)使用可視化樹找到子控件的示例代碼
網(wǎng)頁(yè)地址:http://jinyejixie.com/article24/jjgsce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、面包屑導(dǎo)航品牌網(wǎng)站設(shè)計(jì)、虛擬主機(jī)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
大埔区| 延吉市| 古浪县| 大姚县| 德清县| 建平县| 和龙市| 澳门| 梧州市| 山西省| 三亚市| 襄樊市| 涞源县| 涡阳县| 石嘴山市| 汉沽区| 祁阳县| 宁夏| 盱眙县| 西城区| 娄底市| 峨山| 南丰县| 天柱县| 六盘水市| 凤阳县| 中牟县| 莒南县| 贞丰县| 石棉县| 东港市| 临潭县| 岫岩| 新闻| 什邡市| 湄潭县| 邹平县| 固始县| 塔河县| 大石桥市| 罗城|