Skip to content

Commit

Permalink
Implement Net46 Playground Application (#868)
Browse files Browse the repository at this point in the history
* Syncing with upstream

* Adding shell/MainReactPackage to ReactNative.Net46

* Adding Playground.Net46 WPF application with basic ReactNative integration...

* Added a bootstrapper for initializing the ReactPage and the application's shell...

* Reverting the Examples to the previous version

* * Restyling Net46 RedBoxDialog and ProgressDialog to fit WPF styling...

* Fixed some crashes when starting due to differences between Net46 and UWP

* Converted Net46 Dialogs to be shown as modeless to ensure execution can continue (e.g. progress dialog)

* * Moving Progress Design Data to its own file... Renaming existing design data file/classes

* Added ScrollViewer to RedBoxDialog

* * Implemented a mouse accelerator to invoke the developer support features since KeyDown events are not reaching RootView without
  making the RootView Focusable and explictly setting focus on it...

* Styled the Developer Options dialog...

* Fixed crash when saving application settings via the developer options dialog

* * Set RootView to be Focusable and its FocusVisualStyle to null and ensured the Focus was applied to it by the ReactPage OnCreate

* Restore support for keyboard accelerators to bring up dev options, changed dev option accelerators to match other React Native Clients.

* Fix issue in getting the correct bundle path

* Added support to copy the ChakraCore DLL to the Playground Net46 output directory

* Fixing random issues everywhere...

* Fixing Touch point issues

* Final debugging of Playground.Net46 App

* code cleanup

* upgraded nuget package and implemented websocket module

* Fixing failing tests on dispatcher null reference

* Migrated WebSocketModuleTests to Shared.Tests, Fixed Net46 WebSocketModule

* Applying changes requeted in PR #868

* Fixing race condition between the main window and the progress dialog's show operations...

* Correcting incorrect comment

* Adding fixes/changes from Pull Request code review...
  • Loading branch information
pre10der89 authored and rozele committed Nov 15, 2016
1 parent 1f6eb54 commit 8bf64e1
Show file tree
Hide file tree
Showing 38 changed files with 1,747 additions and 330 deletions.
6 changes: 6 additions & 0 deletions ReactWindows/Playground.Net46/App.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
</startup>
</configuration>
5 changes: 5 additions & 0 deletions ReactWindows/Playground.Net46/App.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Application x:Class="Playground.Net46.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

</Application>
101 changes: 101 additions & 0 deletions ReactWindows/Playground.Net46/App.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace Playground.Net46
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : Application
{
private readonly AppReactPage _reactPage = new AppReactPage();

/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
}

/// <summary>
/// Override method fired prior to the Startup event when the Run method of the Application object is called...
/// </summary>
/// <param name="e"></param>
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
OnCreate(e.Args);
}

/// <summary>
/// Called whenever the app is opened to initialized...
/// </summary>
/// <param name="arguments"></param>
private void OnCreate(string[] arguments)
{
var shellWindow = Application.Current.MainWindow;

if (shellWindow == null)
{
shellWindow = new Window
{
ShowActivated = true,
ShowInTaskbar = true,
Title = "Playground.Net46",
Height = 768,
Width = 1024,
WindowStartupLocation = WindowStartupLocation.CenterScreen
};

Application.Current.MainWindow = shellWindow;
}

//Show Window if it is not already active...
if (!shellWindow.IsLoaded)
{
shellWindow.Show();
}

var rootFrame = shellWindow.Content as Frame;

// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
_reactPage.OnCreate(arguments);

// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();

rootFrame.NavigationFailed += OnNavigationFailed;

// Place the frame in the current Window
shellWindow.Content = rootFrame;
}

if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Content = _reactPage;
}

// Ensure the current window is active
shellWindow.Activate();
}

/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
private void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page...");
}
}
}
41 changes: 41 additions & 0 deletions ReactWindows/Playground.Net46/AppReactPage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using ReactNative;
using ReactNative.Modules.Core;
using ReactNative.Shell;
using System.Collections.Generic;

namespace Playground.Net46
{
internal class AppReactPage : ReactPage
{
public override string MainComponentName => "Playground.Net46";

public override string JavaScriptMainModuleName => "ReactWindows/Playground.Net46/index.windows";

#if BUNDLE
public override string JavaScriptBundleFile
{
get
{
return "ms-appx:///ReactAssets/index.windows.bundle";
}
}
#endif

public override List<IReactPackage> Packages => new List<IReactPackage>
{
new MainReactPackage(),
};

public override bool UseDeveloperSupport
{
get
{
#if !BUNDLE || DEBUG
return true;
#else
return false;
#endif
}
}
}
}
126 changes: 126 additions & 0 deletions ReactWindows/Playground.Net46/Playground.Net46.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7AB3A24A-D5D9-479F-8E12-22213DD40D3F}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Playground.Net46</RootNamespace>
<AssemblyName>Playground.Net46</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;NET46</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NET46</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<PlatformTarget>ARM</PlatformTarget>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<PlatformTarget>ARM</PlatformTarget>
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>
</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="AppReactPage.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ReactNative.Net46\ReactNative.Net46.csproj">
<Project>{22cbff9c-fe36-43e8-a246-266c7635e662}</Project>
<Name>ReactNative.Net46</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<ItemGroup>
<ChakraCoreDll Include="$(SolutionDir)..\ChakraCore\Build\VcBuild\bin\$(Platform)_$(Configuration)\ChakraCore.*" />
</ItemGroup>
<Copy SourceFiles="@(ChakraCoreDll)" DestinationFolder="$(OutputPath)" ContinueOnError="false" />
</Target>
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
53 changes: 53 additions & 0 deletions ReactWindows/Playground.Net46/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Playground.Net46")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Playground.Net46")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.

//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]


[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]


// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
56 changes: 56 additions & 0 deletions ReactWindows/Playground.Net46/index.windows.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/**
* Sample React Native App
* https://github.com/facebook/react-native
*/

import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
} from 'react-native';

class Playground extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>
Welcome to React Native!
</Text>
<Text style={styles.instructions}>
To get started, edit index.windows.js
</Text>
<Text style={styles.instructions}>
Press Ctrl+R to reload
</Text>
<Text style={styles.instructions}>
Press Ctrl+D or Ctrl+M for dev menu
</Text>
</View>
);
}
}

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
width: 500
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
width: 500
},
});

AppRegistry.registerComponent('Playground.Net46', () => Playground);
Loading

0 comments on commit 8bf64e1

Please sign in to comment.