Button click event within a ControlTemplate?
-
Hi, I have a class which derives from TextBox called EntryTextBox and provides a PreviewKeyDown event handler (although for the purposes of this question, it's not relevant). I have produced a ControlTemplate within a style as follows: <Style TargetType="{x:Type my:EntryTextBox}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type my:EntryTextBox}"> <DockPanel> <Border BorderThickness="1" HorizontalAlignment="Stretch" BorderBrush="DarkGray" Background="White" Width="100"> <DockPanel> <Button DockPanel.Dock="Right" Visibility="{Binding Path=KeyboardPopup,Converter={StaticResource VisibilityConverter},RelativeSource={RelativeSource TemplatedParent}}"> <ContentControl Width="15" Height="10" Template="{StaticResource KeyboardIconContent}"/> </Button> <ScrollViewer Margin="0" Background="Transparent" HorizontalAlignment="Stretch" x:Name="PART_ContentHost"/> </DockPanel> </Border> </DockPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> Which as you can see displays a Button as part of the TextEntry box depending on the value of KeyboardPopup. This works fine, but I want to be able to act on the button's click handler from within my EntryTextBox class but don't know how to do it. I've read in "Pro WPF in C# 2008, Matthew MacDonald, P872" that you need to "give your elements recognisable names and attach event handlers to them programatically in the control constructor" but I am unsure of the syntax I should use in the class constructor of EntryTextBox. Can anyone help me? Cheers Richard
-
Hi, I have a class which derives from TextBox called EntryTextBox and provides a PreviewKeyDown event handler (although for the purposes of this question, it's not relevant). I have produced a ControlTemplate within a style as follows: <Style TargetType="{x:Type my:EntryTextBox}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type my:EntryTextBox}"> <DockPanel> <Border BorderThickness="1" HorizontalAlignment="Stretch" BorderBrush="DarkGray" Background="White" Width="100"> <DockPanel> <Button DockPanel.Dock="Right" Visibility="{Binding Path=KeyboardPopup,Converter={StaticResource VisibilityConverter},RelativeSource={RelativeSource TemplatedParent}}"> <ContentControl Width="15" Height="10" Template="{StaticResource KeyboardIconContent}"/> </Button> <ScrollViewer Margin="0" Background="Transparent" HorizontalAlignment="Stretch" x:Name="PART_ContentHost"/> </DockPanel> </Border> </DockPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> Which as you can see displays a Button as part of the TextEntry box depending on the value of KeyboardPopup. This works fine, but I want to be able to act on the button's click handler from within my EntryTextBox class but don't know how to do it. I've read in "Pro WPF in C# 2008, Matthew MacDonald, P872" that you need to "give your elements recognisable names and attach event handlers to them programatically in the control constructor" but I am unsure of the syntax I should use in the class constructor of EntryTextBox. Can anyone help me? Cheers Richard
1. Name the button something line
"PART_Button"
. 2. Then overrideOnApplyTemplate()
. 3. InOnApplyTemplate
useGetTemplateChild("PART_Button")
. That will get you a reference to the button to add your event handler. Of course you will want to check the returned object to make sure is is not null. Someone may change the template for your control. ;) -
1. Name the button something line
"PART_Button"
. 2. Then overrideOnApplyTemplate()
. 3. InOnApplyTemplate
useGetTemplateChild("PART_Button")
. That will get you a reference to the button to add your event handler. Of course you will want to check the returned object to make sure is is not null. Someone may change the template for your control. ;)Thank-you rhuiden, you are a star! That's exactly what I was after. Richard