MLElyakan
MLElyakan

Reputation: 269

How can I access child element of any object by using style?

I'm faced with a problem about to find child element. I want to access TextBlock element inside Label. But I can't find it.

Here is my MainWindow.xaml code:

<Label x:Name="text" Style="{DynamicResource labelstyle}">
     <TextBlock>asdasdasd</TextBlock>           
</Label>

Here is my style code:

<Style x:Key="labelstyle" TargetType="Label">
        <Setter Property="HorizontalContentAlignment" Value="Left" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Label">
                    <Border BorderThickness="2" BorderBrush="Red">
                        <TextBox x:Name="textBox" Text="{Binding RelativeSource={RelativeSource FindAncestor,
                                                    AncestorType={x:Type TextBlock}, 
                                                    AncestorLevel=2},Path=Text}">                                
                        </TextBox>
                    </Border>                       
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>   

I want to bind TextBox's Text property to Label inside TextBlock's Text property. What should I do ? I hope I made my self clear. Thank you.

Below is a sample image: enter image description here

Upvotes: 2

Views: 1105

Answers (2)

trippedOverXaml
trippedOverXaml

Reputation: 171

Instead of using a TextBlock in your label, just leave it in your template and have it reference the Label Content for the text to be displayed.

Below is an example:

<Label x:Name="text" Content="asdasdasd" Style="{StaticResource labelstyle}"/>

and for the styling/template

<Style x:Key="labelstyle" TargetType="{x:Type Label}">
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type Label}">
            <Border BorderThickness="2" BorderBrush="Red">
               <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{TemplateBinding Content}"/>
            </Border>
         </ControlTemplate>
       </Setter.Value>
     </Setter>
<Style>

This should provide you with the centered text in the red border you seem to be trying to achieve.

Hopefully this helps you a bit.

Upvotes: 1

Stewbob
Stewbob

Reputation: 16899

This will let you display text through a binding and the user will be able to select it, but not type in the TextBox. If you want to be able to also type in the TextBox, remove the IsReadOnly="True"

            <Label Height="30" Width="150">
                <Label.Template>
                    <ControlTemplate TargetType="{x:Type Label}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Image Grid.Column="0" 
                                     MinWidth="26"
                                     Margin="2"
                                     Source="{Binding myImageSource}"/>
                            <TextBox Grid.Column="1"
                                             IsReadOnly="True"
                                             Text="{Binding myTextValue}"
                                             Margin="5,2"/>
                        </Grid>
                    </ControlTemplate>
                </Label.Template>
            </Label>

Upvotes: 0

Related Questions