代码之家  ›  专栏  ›  技术社区  ›  Polaris

按名称从ControlTemplate获取代码中的控件

  •  1
  • Polaris  · 技术社区  · 14 年前

    我的WPF应用程序中有下一个控制模板。

        <Style TargetType="Label" x:Key="LabelStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Label">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="40"/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <TextBox x:Name="MyTextBlock" Text="{TemplateBinding Content}"  Height="20" HorizontalAlignment="Left"  VerticalAlignment="Top" />
                            <Label Content="{TemplateBinding Content}" Grid.Column="1" Grid.Row="1"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    文本框“mytextBlock”在窗口的C代码中不可见。我怎样才能用代码访问这个文本块

    3 回复  |  直到 14 年前
        1
  •  4
  •   Amsakanna    14 年前

    尝试将属性直接绑定到文本框的可见性

    <TextBox Visibility="{Binding IsFieldCodesEnabled, Converter={StaticResource BoolToVis}}" />
    

    其中booltovis定义为:

    <Resouces> 
        <loc:BooleanToVisibilityConverter k:key="BoolToVis"/> 
    </Resources>
    
        2
  •  1
  •   Polaris    14 年前

    我为我的处境找到了一些解决办法。我只是在控件模板中使用文本框的已加载事件

        private void MyTextBlock_Loaded(object sender, RoutedEventArgs e)
        {
            TextBox txt = sender as TextBox;
            if (txt!=null)
             {
                Messagebox.Show("It works");
             }
    
        }
    

    但这不是一个很好的解决办法。

        3
  •  1
  •   Igor Zevaka    14 年前

    您可以做一件类似于XAML页面在代码隐藏中所做的事情(除了您需要在 OnApplyTemplate 重写):

    public override void OnApplyTemplate() {
        base.OnApplyTemplate();
    
        var MyTextBlock = this.GetTemplateChild("MyTextBlock")
    }
    

    编辑 刚刚注意到MyTextBlock实际上是一个文本框,因此 TextBox TextBlock 将导致异常。尝试更新的代码。