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
}