我有一个UserControl,它只包含DataTemplate中的TextBlock和TextBox。这是通过以下方式完成的:
<UserControl.Resources>
<DataTemplate DataType="{x:Type Binding:StringBindingData}" x:Key="dataTemp">
<StackPanel Orientation="Horizontal" Name="sPanel">
<TextBlock Name="txtDescription" Text="{Binding Description}" />
<TextBox Name="textboxValue" Text="{Binding Mode=TwoWay, Path=Value, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<Grid>
<ItemsControl Name="textItemsControl" ItemsSource="{Binding}"/>
</Grid>
我需要能够在不同情况下将不同的样式应用于TextBlock / TextBox。例如,在某些情况下,我希望能够将白色前景应用于TextBlock或更改TextBox的宽度。
我尝试过几种不同的方法: 在使用控件的窗口中,我设置了TextBlock的样式:
<Style TargetType="{x:Type TextBlock}" >
<Setter Property="Foreground" Value="White" />
</Style>
这适用于窗口中的所有其他TextBlock。
我还尝试使用
在代码隐藏中获取DataTemplatevar myDataTemplate = (DataTemplate)this.Resources["dataTemp"];
但无法进一步将样式应用于所有TextBlock元素。
答案 0 :(得分:1)
我不确定你的要求。但是为了从后面的代码中找到控件,我建议使用VisualTreeHelper
。我通常使用这个辅助函数来完成我的工作 -
public IEnumerable<T> FindVisualChildren<T>( DependencyObject depObj )
where T : DependencyObject
{
if( depObj != null )
{
for( int i = 0; i < VisualTreeHelper.GetChildrenCount( depObj ); i++ )
{
DependencyObject child = VisualTreeHelper.GetChild( depObj, i );
if( child != null && child is T )
{
yield return (T)child;
}
foreach( T childOfChild in FindVisualChildren<T>( child ) )
{
yield return childOfChild;
}
}
}
}
用法:
foreach (var textBlock in FindVisualChildren<TextBlock>(this))
{
/* Your code here */
}