Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
C# 按名称从ControlTemplate获取代码中的控件_C#_Wpf_Controltemplate - Fatal编程技术网

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

C# 按名称从ControlTemplate获取代码中的控件,c#,wpf,controltemplate,C#,Wpf,Controltemplate,我的WPF应用程序中有下一个控件模板 <Style TargetType="Label" x:Key="LabelStyle"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Label"> <Grid>

我的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#代码中不可见。如何在代码中访问此文本块

您可以执行与XAML页面在代码隐藏中类似的操作(除了需要在应用程序模板覆盖中执行此操作外):


EDIT刚刚注意到MyTextblock实际上是一个文本框,因此将
TextBox
强制转换为
TextBlock
将导致异常。尝试更新的代码。

您可以执行与XAML页面在代码隐藏中类似的操作(除了需要在应用程序模板上执行此操作之外):


EDIT刚刚注意到MyTextblock实际上是一个文本框,因此将
TextBox
强制转换为
TextBlock
将导致异常。尝试更新的代码。

我找到了一些解决方案。我只是在ControlTemplate中使用文本框的已加载事件

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

    }

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

我找到了一些解决我的问题的办法。我只是在ControlTemplate中使用文本框的已加载事件

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

    }

但这不是一个很好的解决方案。

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

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

其中布尔托维斯的定义为:

<Resouces> 
    <loc:BooleanToVisibilityConverter k:key="BoolToVis"/> 
</Resources>

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

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

其中布尔托维斯的定义为:

<Resouces> 
    <loc:BooleanToVisibilityConverter k:key="BoolToVis"/> 
</Resources>



可能重复:这个问题看起来很不一样,因为它不涉及控件模板。可能重复:这个问题看起来很不一样,因为它不涉及控件模板。İgor它不起作用。我的控件模板位于Window.Resources中。我将您的代码粘贴到我的应用程序中,并将断点设置为检查变量。但MyTextBlock变量保持为空。我做错了什么?你用XAML设置了标签上的样式了吗?像这样:
试试
(TextBlock)this.FindName(“MyTextBlock”)我理解它并使用正确的文本框转换,但findName方法返回null
GetTemplateChild
似乎有效,即使MSDN建议不使用它。我会调查的。İgor这不是工作。我的控件模板位于Window.Resources中。我将您的代码粘贴到我的应用程序中,并将断点设置为检查变量。但MyTextBlock变量保持为空。我做错了什么?你用XAML设置了标签上的样式了吗?像这样:
试试
(TextBlock)this.FindName(“MyTextBlock”)我理解它并使用正确的文本框转换,但findName方法返回null
GetTemplateChild
似乎有效,即使MSDN建议不使用它。我会调查的,不!显然,这并不优雅。除此之外,你能告诉我需要访问那个特定的文本框,这样我就可以告诉你另一种解决方案,因为从codebehind按名称访问元素几乎是不推荐的。我可以告诉你。我想在某些情况下隐藏文本框,并在需要时显示它。这就是为什么我想用Visibility属性获取用于操纵的TextBox实例。如果需要的话,可以在xaml中使用bind-your-Visibility属性,而不是使用BindingConverter。如果你能告诉我可见性所依赖的条件,我想我可以把它画清楚。我有一个静态类,它的静态bool属性为“isFieldCodesEnabled”。在打开窗口之前,我检查这个属性的值:为真-然后我显示我的文本框,如果为假,我隐藏它。否!显然,这并不优雅。除此之外,你能告诉我需要访问那个特定的文本框,这样我就可以告诉你另一种解决方案,因为从codebehind按名称访问元素几乎是不推荐的。我可以告诉你。我想在某些情况下隐藏文本框,并在需要时显示它。这就是为什么我想用Visibility属性获取用于操纵的TextBox实例。如果需要的话,可以在xaml中使用bind-your-Visibility属性,而不是使用BindingConverter。如果你能告诉我可见性所依赖的条件,我想我可以把它画清楚。我有一个静态类,它的静态bool属性为“isFieldCodesEnabled”。在打开窗口之前,我检查这个属性的值:为真-然后我显示我的文本框,如果为假,我隐藏它。是的!底线是,如果您在这种情况下试图在代码中访问文本框,那么几乎可以肯定您做了一些非常错误的事情。这是一个很好的答案,因为它显示了正确的方法。如果可以,我会给你+10。我喜欢这个解决方案。纯正易懂!!我完全不明白。您的文本框与原始文本框不同。IsFieldCodesEnabled在哪里定义?在使用此样式的控件的窗口中?是!底线是,如果您在这种情况下试图在代码中访问文本框,那么几乎可以肯定您做了一些非常错误的事情。这是一个很好的答案,因为它显示了正确的方法。如果可以,我会给你+10。我喜欢这个解决方案。纯正易懂!!我完全不明白。您的文本框与原始文本框不同。IsFieldCodesEnabled在哪里定义?在使用此样式的控件的窗口中?