views:

47

answers:

1

Hello everyone, 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?

A: 

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.

Jonas Stawski