Welcome to Ultra Developers.

the company that developes your success

Read Blog


How to: Send mails in Windows 8 Store Apps using C#

How to: Send mails in Windows 8 Store Apps using C#

Sometimes you need to let your Windows 8 Store Apps users to send email from your Windows 8 Store Application to open a support ticket or feedback about an issue in your application. In this article we will create a Windows Store App that can send mails from the About Settings Flyout.

Create a Windows Store App

1.       Open Visual Studio 2012 for Windows 8.

2.       Click on New Project. The New Project Dialog box appears.

3.       From the left pane select C# and then Windows Store Templates.

4.       From the right pane select Grid App Template.

5.       Type your project name and then click Ok. We set the project name to AboutSettingsApp.

Create a new Windows Store App

Create the About Flyout UI

1.       Open Solution Explorer. Right Click the AboutSettingsApp project and Click Add New Item. The Add New Item dialog opens

Create a new Windows Store App

2.       Select UserControl from the middle pane.

3.       Type the AboutFlyout.xaml in the name textbox and Click Add.

4.       Copy the following XAML code and Paste it between the UserControl begin and End tag.

 

<UserControl.Resources>

    <Style x:Key="SettingsBackButtonStyle" TargetType="Button">

        <Setter Property="MinWidth" Value="0"/>

        <Setter Property="FontFamily" Value="Segoe UI Symbol"/>

        <Setter Property="FontWeight" Value="Normal"/>

        <Setter Property="FontSize" Value="26.66667"/>

        <Setter Property="AutomationProperties.AutomationId" Value="BackButton"/>

        <Setter Property="AutomationProperties.Name" Value="Back"/>

        <Setter Property="AutomationProperties.ItemType" Value="Navigation Button"/>

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="Button">

                    <Grid x:Name="RootGrid" Width="30" Height="30">

                        <Grid Margin="-6,-6,0,0">

                            <TextBlock x:Name="BackgroundGlyph" Text="&#xE0D4;" Foreground="{StaticResource BackButtonBackgroundThemeBrush}"/>

                            <TextBlock x:Name="NormalGlyph" Text="{StaticResource BackButtonSnappedGlyph}" Foreground="{StaticResource BackButtonForegroundThemeBrush}"/>

                            <TextBlock x:Name="ArrowGlyph" Text="&#xE0C4;" Foreground="{StaticResource BackButtonPressedForegroundThemeBrush}" Opacity="0"/>

                        </Grid>

                        <Rectangle

                        x:Name="FocusVisualWhite"

                        IsHitTestVisible="False"

                        Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"

                        StrokeEndLineCap="Square"

                        StrokeDashArray="1,1"

                        Opacity="0"

                        StrokeDashOffset="1.5"/>

                        <Rectangle

                        x:Name="FocusVisualBlack"

                        IsHitTestVisible="False"

                        Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"

                        StrokeEndLineCap="Square"

                        StrokeDashArray="1,1"

                        Opacity="0"

                        StrokeDashOffset="0.5"/>

 

                        <VisualStateManager.VisualStateGroups>

                            <VisualStateGroup x:Name="CommonStates">

                                <VisualState x:Name="Normal" />

                                <VisualState x:Name="PointerOver">

                                    <Storyboard>

                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">

                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonPointerOverBackgroundThemeBrush}"/>

                                        </ObjectAnimationUsingKeyFrames>

                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalGlyph" Storyboard.TargetProperty="Foreground">

                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonPointerOverBackgroundThemeBrush}"/>

                                        </ObjectAnimationUsingKeyFrames>

                                    </Storyboard>

                                </VisualState>

                                <VisualState x:Name="Pressed">

                                    <Storyboard>

                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">

                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonForegroundThemeBrush}"/>

                                        </ObjectAnimationUsingKeyFrames>

                                        <DoubleAnimation

                                        Storyboard.TargetName="ArrowGlyph"

                                        Storyboard.TargetProperty="Opacity"

                                        To="1"

                                        Duration="0"/>

                                        <DoubleAnimation

                                        Storyboard.TargetName="NormalGlyph"

                                        Storyboard.TargetProperty="Opacity"

                                        To="0"

                                        Duration="0"/>

                                    </Storyboard>

                                </VisualState>

                                <VisualState x:Name="Disabled">

                                    <Storyboard>

                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Visibility">

                                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>

                                        </ObjectAnimationUsingKeyFrames>

                                    </Storyboard>

                                </VisualState>

                            </VisualStateGroup>

                            <VisualStateGroup x:Name="FocusStates">

                                <VisualState x:Name="Focused">

                                    <Storyboard>

                                        <DoubleAnimation

                                        Storyboard.TargetName="FocusVisualWhite"

                                        Storyboard.TargetProperty="Opacity"

                                        To="1"

                                        Duration="0"/>

                                        <DoubleAnimation

                                        Storyboard.TargetName="FocusVisualBlack"

                                        Storyboard.TargetProperty="Opacity"

                                        To="1"

                                        Duration="0"/>

                                    </Storyboard>

                                </VisualState>

                                <VisualState x:Name="Unfocused" />

                                <VisualState x:Name="PointerFocused" />

                            </VisualStateGroup>

                        </VisualStateManager.VisualStateGroups>

                    </Grid>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

 

    <Style x:Key="FlyoutHyperlink" TargetType="HyperlinkButton">

        <Setter Property="Foreground" Value="#FF606060"/>

        <Setter Property="Margin" Value="-20,0,0,0"/>

        <Setter Property="FontWeight" Value="SemiLight"/>

    </Style>

    </UserControl.Resources>

 

<Grid>

    <Border Name="AboutBorder" BorderBrush="Black" BorderThickness="1,0,0,0">

        <Grid Background="White" VerticalAlignment="Stretch" FlowDirection="LeftToRight">

            <Grid.RowDefinitions>

                <RowDefinition Height="80"/>

                <RowDefinition Height="*"/>

            </Grid.RowDefinitions>

 

            <!--Settings Header-->

            <Grid Background="#FF688623" Grid.Row="0">

                <Grid Grid.Row="0" Margin="40,32,17,13">

                    <Grid.Transitions>

                        <TransitionCollection>

                            <EntranceThemeTransition FromHorizontalOffset="50"/>

                        </TransitionCollection>

                    </Grid.Transitions>

                    <Grid.ColumnDefinitions>

                        <ColumnDefinition Width="30"/>

                        <ColumnDefinition Width="*"/>

                        <ColumnDefinition/>

                    </Grid.ColumnDefinitions>

 

                    <Button Name="AboutBackButton" Margin="0,3,0,0" Grid.Column="0" Click="AboutBackButton_Click"

                        Style="{StaticResource SettingsBackButtonStyle}" HorizontalAlignment="Left" />

                    <TextBlock Name="HeaderTextBlock" Text="About" Grid.Column="1" Margin="10,0,0,0"

                            FontFamily="Segoe UI" FontWeight="SemiLight" FontSize="24.6667" HorizontalAlignment="Left" />

                    <Image Name="LogoImage" Source="Assets/SmallLogo.png" Margin="0,0,6,0" Grid.Column="2" HorizontalAlignment="Right" />

                </Grid>

            </Grid>

 

            <!--Settings Content-->

            <Grid Grid.Row="1" Margin="40,24,23,0" VerticalAlignment="Top">

                <Grid.Transitions>

                    <TransitionCollection>

                        <EntranceThemeTransition FromHorizontalOffset="120"/>

                    </TransitionCollection>

                </Grid.Transitions>

                <Grid.ColumnDefinitions>

                    <ColumnDefinition Width="1*"/>

                    <ColumnDefinition Width="3*"/>

                </Grid.ColumnDefinitions>

                <Grid.RowDefinitions>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition/>

                </Grid.RowDefinitions>

                   

                <TextBlock Name="ContactTitleTextBlock" Grid.Row="4" Grid.Column="0" Text="Contact" Style="{StaticResource FlyoutTextBlock}" Margin="0,5" />

                <HyperlinkButton Name="ContactHyperlinkButton" Grid.Row="4" Grid.Column="1" Content="Support@UltraDevelopers.net"

                                    Click="ContactHyperlinkButton_Click" Style="{StaticResource FlyoutHyperlink}" />

 

            </Grid>

        </Grid>

    </Border>

</Grid>

a.       The above XAML code simply creates a style for the Back button of the About Flyout and another style for the HyperlinkButton.

b.      Register the Click event of the back button.

c.       Adds a parent Grid that will contain the Control Content.

d.      Inside this Grid we add two Grids one for Header and the other for content.

e.      Adds a TextBlock control and name it ContactTitleTextBlock. Sets its Text to Contact.

f.        Add a HyperlinkButton and Set its Content to your support email and register the Event handler that fires when a user click on the Hyperlink button.

5.       Press F7 to open the Code for the AboutFlyout user control.

 

Adding Code to the About Flyout

1.       Copy the following code and add it after the AboutFlyout constructor method.

 

private void AboutBackButton_Click(object sender, RoutedEventArgs e)

{

    if (this.Parent.GetType() == typeof(Popup))

    {

        ((Popup)this.Parent).IsOpen = false;

    }

    SettingsPane.Show();

}

 

private async void ContactHyperlinkButton_Click(object sender, RoutedEventArgs e)

{

    Uri mailUri = new Uri(string.Format("mailto:{0}?Subject=Your Application Version {1} for Windows 8",

        ContactHyperlinkButton.Content.ToString(), "1.0.0.0"), UriKind.Absolute);

    await Launcher.LaunchUriAsync(mailUri);

}

a.       The above code simply Handle the click event of the Back button. In this event we close the Popup control that holds the AboutFlyout User Control.

b.      And Show the Settings Pane.

c.       Then we handle the ContactHyperlinkButton Click event.

d.      We create an instance of the Uri class and pass to it url that we need to open. In this case we use the mailto protocol this allows windows to open the default mail Application for Windows 8 which is Mail.

e.      In the mailto protocol you can pass the To email address, subject, cc, bcc and even the email message body. In our sample we only pass the To address and message subject.

2.        

Create the UI and adding Code to MainPage

1.       Open the MainPage.xaml.cs file by double clicking the MainPage.xaml file from the Solution Explorer.

2.       Add the following namespaces to the start of the MainPage.xaml.cs file.

using Windows.UI.ApplicationSettings;

3.       Add the following lines to the MainPage.xaml.cs above the MainPage Contructor method

private Rect windowBounds;

private Popup aboutPopup;

private double settingsWidth = 346;


4.       Find the MainPage Constructor method and add the following code to it after the call to InitializeComponent method:

public MainPage()

{

    this.InitializeComponent();

 

    windowBounds = Window.Current.Bounds;

    Window.Current.SizeChanged += Current_SizeChanged;

    SettingsPane.GetForCurrentView().CommandsRequested += MainPage_CommandsRequested;

}

a.       The above code simply sets the windowBounds Rect variable created in the MainPage class to the Current window bounds.

b.      Adds a handler to the CommandsRequested Event. The CommandsRequested event occurs when the user opens the settings pane. Listening for this event lets the app initialize the setting commands and pause its UI until the user closes the pane.

c.       During this event, we will append our SettingsCommand objects to the available ApplicationCommands vector to make them available to the SettingsPane UI.

 

6.       After the MainPage Constructor method add the following code that will run when the CommandsRequested event fires.

private void MainPage_CommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args)

{

    SettingsCommand aboutCommand = new SettingsCommand("About", "About", (x) =>

    {

        aboutPopup = new Popup();

        aboutPopup.IsLightDismissEnabled = true;

        aboutPopup.Width = settingsWidth;

        aboutPopup.Height = windowBounds.Height;

 

        aboutPopup.Closed += AboutPopup_Closed;

        Window.Current.Activated += Current_Activated;

 

        AboutFlyout aboutFlyout = new AboutFlyout();

        aboutFlyout.Width = settingsWidth;

        aboutFlyout.Height = windowBounds.Height;

 

        aboutPopup.Child = aboutFlyout;

        aboutPopup.SetValue(Canvas.LeftProperty, windowBounds.Width - settingsWidth);

        aboutPopup.SetValue(Canvas.TopProperty, 0);

        aboutPopup.IsOpen = true;

    });

 

    args.Request.ApplicationCommands.Clear();

    args.Request.ApplicationCommands.Add(aboutCommand);

}

 

private void AboutPopup_Closed(object sender, object e)

{

    aboutPopup.Closed -= AboutPopup_Closed;

}

a.       In the above code we simply create an object of the SettingsCommand class. The SettingsCommand creates a settings command object that represents a settings entry. This settings command can be appended to the ApplicationCommands vector.

b.      We set the SettingsCommand object Id to About.

c.        Set the SettingsCommand Text to About.

d.      Add a handler for the event that is raised when the user selects the command.

e.      In the command handler we set the aboutPopup object created in the MainPage class to a new Popup object.

f.        Set the aboutPopup width and height properties.

g.       Set the aboutPopup IsLightDismissEnabled to true so that the aboutPopup closes when the user interacts with the application UI.

h.      Add a handler for the aboutPopup Closed event.

i.         Add a handler for the Current Window Activated event.

j.        Create an instance of the AboutFlyout User control created earlier and set its width and height.

k.       Set the child property of the aboutPopup to the aboutFlyout object. And finally open the Popup.

l.         Then we clear the ApplicationCommands vector and add our about Settings Command.

 

7.       In the AboutPopup_Closed event handler, we clear the close event handler.

8.       Build your project and run the project in Simulator.

 

9.       Open the Settings charm. You will find two commands. The About command and a system added command for Permission.

10.       Click on the About settings command this will open the About Flyout that contains the Contact email.


Create a new Windows Store App

11.       Click on the email address, this will launch the default email program in Windows 8 which is Mail Application with the provided email in the two field and provided subject in the subject field.

Create a new Windows Store App

Create a new Windows Store App

Similar Posts