C# 按名称从ControlTemplate获取代码中的控件
我的WPF应用程序中有下一个控件模板C# 按名称从ControlTemplate获取代码中的控件,c#,wpf,controltemplate,C#,Wpf,Controltemplate,我的WPF应用程序中有下一个控件模板 <Style TargetType="Label" x:Key="LabelStyle"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Label"> <Grid>
<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方法返回nullGetTemplateChild
似乎有效,即使MSDN建议不使用它。我会调查的。İgor这不是工作。我的控件模板位于Window.Resources中。我将您的代码粘贴到我的应用程序中,并将断点设置为检查变量。但MyTextBlock变量保持为空。我做错了什么?你用XAML设置了标签上的样式了吗?像这样:
试试(TextBlock)this.FindName(“MyTextBlock”)代码>我理解它并使用正确的文本框转换,但findName方法返回nullGetTemplateChild
似乎有效,即使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在哪里定义?在使用此样式的控件的窗口中?