Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何找到模板中的ListBox?_Wpf - Fatal编程技术网

Wpf 如何找到模板中的ListBox?

Wpf 如何找到模板中的ListBox?,wpf,Wpf,在切换按钮上。我写了一个弹出窗口,在这个弹出窗口中,有一个列表框。如何从代码隐藏中访问此文件?我尝试过FindName,但没有用 已尝试: var something= btnTLanguage.FindName("LstBTLanguage"); var uiElement = (ToggleButton)btnTLanguage; var toggleButton = uiElement.Template.FindName("LstBTLanguage", uiElement);//n

在切换按钮上。我写了一个弹出窗口,在这个弹出窗口中,有一个列表框。如何从代码隐藏中访问此文件?我尝试过
FindName
,但没有用

已尝试:

 var something=  btnTLanguage.FindName("LstBTLanguage");

var uiElement = (ToggleButton)btnTLanguage;
var toggleButton = uiElement.Template.FindName("LstBTLanguage", uiElement);//no use
这是我的风格

 <StackPanel Name="sta" Background="Transparent">
    <ToggleButton Name="btnTLanguage"  >
        <ToggleButton.Style>
            <Style TargetType="ToggleButton">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ToggleButton">
                            <StackPanel>
                                <Popup  IsOpen="{Binding IsChecked, ElementName=btnTLanguage}" VerticalOffset="1" HorizontalOffset="0"  >
                                    <Border Background="White" >
                                        <StackPanel>
                                            <ListBox DisplayMemberPath="VALUE" SelectedValuePath="KEY"  Name="LstBTLanguage" Width="Auto"  IsEnabled="False" >

                                            </ListBox>
                                        </StackPanel>
                                    </Border>
                                </Popup>
                                <ContentPresenter />
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ToggleButton.Style>
    </ToggleButton>
</StackPanel>
您可以使用在树中搜索
列表框

关键是检查cild元素是否是一个
弹出窗口
。由于
Popup
不直接承载其子对象,因此我们必须通过访问
Popup.child
属性来展开子对象

其次,您必须等待
窗口
页面
加载
(订阅
加载
事件)

按名称搜索
框架元素

ListBox listBox = this.btnTLanguage.Template.FindName("LstBTLanguage", this.btnTLanguage);

按类型搜索元素(第一次出现):


是的,当然可以。你可以传入任何元素。它扩展了
DependecyObject
。它不起作用。很抱歉,我找不到弹出窗口。我的意思是(childElement是弹出窗口)不是hittingNo.
VisualTreeHelper
可从.NET 3.0上获得。这是我使用它给我空结果的方式,这是原因。我写过你应该等待加载的事件。在构造函数中注册一个事件处理程序:this.Loaded+=OnLoaded;在这个处理程序中执行搜索。请自己尝试。然后它就会工作。对于guys在构建可视化树后寻找ans这将起作用,意味着如果您调用ctro,它将不起作用
ListBox listBox = this.btnTLanguage.Template.FindName("LstBTLanguage", this.btnTLanguage);
private bool TryFindCildElement(DependencyObject parent, string elementName, out FrameworkElement resultElement)
{
  resultElement = null;
  for (var childIndex = 0; childIndex < VisualTreeHelper.GetChildrenCount(parent); childIndex++)
  {
    DependencyObject childElement = VisualTreeHelper.GetChild(parent, childIndex);

    if (childElement is Popup popup)
    {
      childElement = popup.Child;
    }

    if (childElement is FrameworkElement uiElement && uiElement.Name.Equals(elementName, StringComparison.OrdinalIgnoreCase))
    {
      resultElement = childElement as FrameworkElement;
      return true;
    }

    if (TryFindCildElement(childElement, elementName, out resultElement))
    {
      return true;
    }
  }

  return false;
}
FrameworkElement listView;
if (TryFindCildElement(this.btnTLanguage, "LstBTLanguage", out listView))
{
  // Element found
}
private bool TryFindCildElement<TElement>(DependencyObject parent, out TElement resultElement) where TElement : DependencyObject
{
  resultElement = null;
  for (var childIndex = 0; childIndex < VisualTreeHelper.GetChildrenCount(parent); childIndex++)
  {
    DependencyObject childElement = VisualTreeHelper.GetChild(parent, childIndex);

    if (childElement is Popup popup)
    {
      childElement = popup.Child;
    }

    if (childElement is TElement)
    {
      resultElement = childElement as TElement;
      return true;
    }

    if (TryFindCildElement(childElement, out resultElement))
    {
      return true;
    }
  }

  return false;
}
ListBox listView;
if (TryFindCildElement(this.btnTLanguage, out listView))
{
  // Element found
}