visc
visc

Reputation: 4959

Get TextBlock inside Button

I have a Button with a TextBlock embedded inside. When the Button is clicked, I want to be able to fetch the TextBlock inside it and modify it's members.

Here is how my button is setup:

<Button Click="Select_Click" Style="{StaticResource ButtonStyle}" HorizontalAlignment="Left" Padding="0,20,20,20">
    <TextBlock Text="My text" FontSize="20" Style="{StaticResource TextBlockStyle}"/>
</Button>

In my code behind I want to be able to access the embedded TextBlock:

public void Select_Click(object sender, RoutedEventArgs e)
{
    // Get the `TextBlock` from `sender` here
}

I've taken a look at the visual tree of the Button but I'm not seeing the TextBlock. I called GetVisualChildren() on the Button but I only see a Grid and no way to get to the Textblock.

Upvotes: 2

Views: 3494

Answers (2)

Dammer15
Dammer15

Reputation: 190

Just do some casting and it's pretty simple

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Establish_handlers();
    }

    void Establish_handlers()
    {
        Mybutton.Click += Mybutton_Click;

    }

    private void Mybutton_Click(object sender, RoutedEventArgs e)
    {
        Button clicked_button = (Button)sender;
        TextBlock desired_text = (TextBlock)clicked_button.Content;
        Textbox_Show_Button_Content.Text = desired_text.Text;
    }
}


<StackPanel>
    <Button x:Name="Mybutton">
        <TextBlock>Hello</TextBlock>
    </Button>
    <TextBox x:Name="Textbox_Show_Button_Content"></TextBox>
</StackPanel>

Upvotes: 1

Marian Dolinsk&#253;
Marian Dolinsk&#253;

Reputation: 3492

The content of the Button is stored in its Content property and in your case, the TextBlock is the content of the Button.

public void Select_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    TextBlock textBlock = (TextBlock)button.Content;
}

Upvotes: 4

Related Questions