2

DataTemplate 内に TextBlock と TextBox を単純に含む UserControl があります。これは次の方法で行われます。

<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>

これは、ウィンドウ内の他のすべての TextBlocks で機能しました。

また、分離コードで DataTemplate を取得しようとしました

var myDataTemplate = (DataTemplate)this.Resources["dataTemp"];

しかし、すべての TextBlock 要素にスタイルを適用することはできませんでした。

4

1 に答える 1

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  */
}
于 2012-10-02T15:53:59.080 に答える