访问扩展器控件的子级

潘卡

我在扩展器的ContentTemplate内部有一个文本块。我想在文件后面的代码中访问该文本块。到目前为止,这是我尝试过的

<Expander x:Name="myExp" Header="Whatever ...">
            <Expander.ContentTemplate>
                <DataTemplate>
                    <TextBlock x:Name="txtWhatever"/>
                </DataTemplate>
            </Expander.ContentTemplate>
</Expander>  

我尝试找到扩展器的子元素,但是以下方法返回null,因为它没有找到扩展器的任何子元素。

ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myExp);


private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
            return (childItem)child;
        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
} 

正确的方法是什么?此外,扩展器上已应用了控制模板。

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Expander}">
            <Border SnapsToDevicePixels="true" BorderThickness="1,1,1,1" Margin="0,0,0,-2"  BorderBrush="{DynamicResource DisabledBorderBrush}" >
                <DockPanel>
                    <ToggleButton x:Name="HeaderSite"   MinHeight="0" MinWidth="0" Style="{DynamicResource ToggleButtonGraphicsStyleLRUHeader}"
                                Content="{TemplateBinding Header}" ContentTemplate="{TemplateBinding HeaderTemplate}" 
                                ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}" FontFamily="{TemplateBinding FontFamily}" 
                                FontSize="{TemplateBinding FontSize}" FontStretch="{TemplateBinding FontStretch}" 
                                FontStyle="{TemplateBinding FontStyle}" FontWeight="{TemplateBinding FontWeight}" 
                                Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" 
                                IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" DockPanel.Dock="Top" 
                                Height="24"/>
                    <ContentPresenter x:Name="ExpandSite"  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Focusable="false" Visibility="Collapsed" DockPanel.Dock="Bottom"/>
                </DockPanel>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsExpanded" Value="true">
                    <Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>
国王王

我已经尝试过您的代码,几乎可以了。我已经尝试过先在一个Button上对其进行测试,但是效果很好。但是,对于Expander,则更为复杂。这里有2条注意事项:

  • 确保扩展器已扩展(IsExpanded = true)。
  • 确保布局已更新(可以UpdateLayout显式调用

因此,代码应为:

yourExpander.IsExpanded = true;
yourExpander.UpdateLayout();
//now use your method
var textBlock = FindVisualChild<TextBlock>(yourExpander);

您的代码可以这样缩短:

private childItem FindVisualChild<childItem>(DependencyObject obj) 
                               where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if(child is childItem) return (childItem)child;            
        childItem childOfChild = FindVisualChild<childItem>(child);
        if (childOfChild != null) return childOfChild;            
    }
    return null;
}

请注意,child永远不会null由于GetChildrenCount()已经限制了现有子项的范围,因此child应当存在于指定的index处i

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何停止WPF控件(使用扩展器)在ItemControl中扩展到父级的高度

来自分类Dev

扩展时修改扩展器头子级

来自分类Dev

扩展时修改扩展器头子级

来自分类Dev

WPF扩展器控件-转换的页眉宽度问题

来自分类Dev

错误:在PreRender之前可能未注册扩展器控件

来自分类Dev

WPF动态创建的按钮和扩展器控件

来自分类Dev

错误:扩展器控件可能未在PreRender之前注册

来自分类Dev

使扩展器控件标头变为粗体

来自分类Dev

在WPF扩展器控件上更改边框的拐角半径?

来自分类Dev

当所有子级都折叠或隐藏时,如何在分层数据模板中隐藏扩展器?

来自分类Dev

扩展器不能位于与其扩展的控件不同的 UpdatePanel 中。更新面板异常

来自分类Dev

扩展器与GridSplitter结合

来自分类Dev

扩展器与GridSplitter结合

来自分类Dev

使扩展器中的列表框不超出其他控件并滚动

来自分类Dev

更新面板中的模式弹出窗口扩展器中的Web用户控件中的jQuery问题

来自分类Dev

扩展器控件中切换按钮的可见性无法正常工作

来自分类Dev

WPF扩展器未扩展

来自分类Dev

WPF扩展器未扩展

来自分类Dev

扩展一个扩展器也应该扩展所有其他扩展器

来自分类Dev

带多个按钮的WPF扩展器

来自分类Dev

带GridSplitter的WPF扩展器

来自分类Dev

仅CSS的CSS扩展器

来自分类Dev

带GridSplitter的WPF扩展器

来自分类Dev

使用扩展器更改边框的大小

来自分类Dev

WPF +扩展器控制问题

来自分类Dev

网状 Wifi 与 WiFi 扩展器

来自分类Dev

ItemsPresenter 从扩展器获取背景

来自分类Dev

短信语言文本扩展器 - Pandas

来自分类Dev

网络 WiFi 扩展器创建了另一个我无法在家中访问的网络

Related 相关文章

热门标签

归档