OnApplyTemplate is not being called

I have a solution with 2 projects: Windows Phone App and a Windows Phone Class Library. The class library has a control called MessageBoxExtended which inherits from ContentControl. The project also has a Themes folder with a generic.xaml file. The file has the Build Action set to Page and it looks like this:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:KontactU.Common.WPControls;assembly=KontactU.Common.WPControls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"   
mc:Ignorable="d">
<Style TargetType="local:MessageBoxExtended">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MessageBoxExtended">
                <Grid x:Name="LayoutRoot">
                <StackPanel>
                        <TextBlock x:Name="lblTitle" Text="Title Goes Here" Style="{StaticResource PhoneTextTitle3Style}"/>
                        <TextBlock x:Name="lblMessage" Text="Some long message here repeated over and over again. Some long message here repeated over and over again. " TextWrapping="Wrap" Style="{StaticResource PhoneTextNormalStyle}" />
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <Button x:Name="btnLeft" Content="Button1" Click="btnLeft_Click"></Button>
                            <Button x:Name="btnCenter" Content="Button2" Click="btnCenter_Click"></Button>
                            <Button x:Name="btnRight" Content="Button3" Click="btnRight_Click"></Button>
                        </StackPanel>
                    </StackPanel>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

The control code looks like this:

 public class MessageBoxExtended : ContentControl
{
    private TextBlock lblTitle;
    private TextBlock lblMessage;
    private Button btnLeft;
    private Button btnCenter;
    private Button btnRight;

    private bool currentSystemTrayState;

    internal Popup ChildWindowPopup
    {
        get;
        private set;
    }

    private static PhoneApplicationFrame RootVisual
    {
        get
        {
            return Application.Current == null ? null : Application.Current.RootVisual as PhoneApplicationFrame;
        }
    }

    public MessageBoxExtended()
        : base()
    {
        DefaultStyleKey = typeof(MessageBoxExtended);
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        lblTitle = this.GetTemplateChild("lblTitle") as TextBlock;
        lblMessage = this.GetTemplateChild("lblMessage") as TextBlock;
        btnLeft = this.GetTemplateChild("btnLeft") as Button;
        btnCenter = this.GetTemplateChild("btnCenter") as Button;
        btnRight = this.GetTemplateChild("btnRight") as Button;

        InitializeMessageBoxExtended("Title", "Message", MessageBoxExtendedButtonType.Ok);
    }

    private void InitializeMessageBoxExtended(string title, string message, MessageBoxExtendedButtonType buttonType)
    {
        HideSystemTray();
        lblTitle.Text = title;
        lblMessage.Text = message;

        switch (buttonType)
        {
            case MessageBoxExtendedButtonType.Ok:
                btnLeft.Visibility = System.Windows.Visibility.Collapsed;
                btnRight.Visibility = System.Windows.Visibility.Collapsed;
                btnCenter.Content = "ok";
                break;
            case MessageBoxExtendedButtonType.OkCancel:
                btnCenter.Visibility = System.Windows.Visibility.Collapsed;
                btnLeft.Content = "ok";
                btnRight.Content = "cancel";
                break;
            case MessageBoxExtendedButtonType.YesNo:
                btnCenter.Visibility = System.Windows.Visibility.Collapsed;
                btnLeft.Content = "yes";
                btnRight.Content = "no";
                break;
        }
    }

    public void Show(string title, string message, MessageBoxExtendedButtonType buttonType)
    {
        if (ChildWindowPopup == null)
        {
            ChildWindowPopup = new Popup();

            try
            {
                ChildWindowPopup.Child = this;
            }
            catch (ArgumentException)
            {
                throw new InvalidOperationException("The control is already shown.");
            }
        }

        if (ChildWindowPopup != null && Application.Current.RootVisual != null)
        {
            // Configure accordingly to the type
            InitializeMessageBoxExtended(title, message, buttonType);

            // Show popup
            ChildWindowPopup.IsOpen = true;
        }
    }

    private void HideSystemTray()
    {
        // Capture current state of the system tray
        this.currentSystemTrayState = SystemTray.IsVisible;
        // Hide it
        SystemTray.IsVisible = false;
    }
}

The Windows Phone App references it and calls it in the code behind by instantiating it and calling the Show method:

MessageBoxExtended mbe = new MessageBoxExtended();
mbe.Show();

The problem is that the OnApplyTemplate is never called. I've tried commenting out all the lines in the generic.xaml, but I get the same result.

Any ideas?

Answers


Never mind, it was my mistake. I added

if (lblTitle == null)
            return;

to the InitializeMessageBoxExtended() method and now it works. If you follow the logic the constructor is called before the OnApplyTemplate() which calls the InitializeMessageBoxExtended() and therefore the values are null. By adding the code above the control doesn't throw an exception, it continues and when the control is part of the VisualTree the OnApplyTemplate is called.

Hope this helps anyone out there.


Need Your Help

URL Redirects for SEO (in Flash)?

javascript ruby-on-rails flash seo

I am creating a flash site and am trying to make it SEO. I'm thinking a possible solution would be to render html to any search engine bot, or to anyone who needs accessibility, and rendering the ...

Variable is not defined even though it is?

javascript php ajax http

Hi I'm trying to call a php function when a button is pressed but I keep getting the error in the title.