Merge pull request #2095 from Garfield550/hackfest2017
Update Hackfest 2017 page
This commit is contained in:
Коммит
0c3b60b0e2
|
@ -143,9 +143,10 @@ namespace MvvmCross.iOS.Support.XamarinSidebar
|
|||
|
||||
Mvx.RegisterSingleton<IMvxSidebarViewController>(SideBarViewController);
|
||||
|
||||
CloseMasterNavigationController();
|
||||
CleanupModalViewControllers();
|
||||
CloseTabBarViewController();
|
||||
CloseSplitViewController();
|
||||
CloseMasterNavigationController();
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -133,6 +133,12 @@ namespace MvvmCross.Core.Navigation
|
|||
{
|
||||
var facadeRequest = await facade.BuildViewModelRequest(path, paramDict).ConfigureAwait(false);
|
||||
request.ViewModelType = facadeRequest.ViewModelType;
|
||||
|
||||
if (facadeRequest.ParameterValues != null)
|
||||
{
|
||||
request.ParameterValues = facadeRequest.ParameterValues;
|
||||
}
|
||||
|
||||
request.ViewModelInstance = ViewModelLoader.LoadViewModel(request, null);
|
||||
|
||||
if (facadeRequest == null)
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
using MvvmCross.Core.ViewModels;
|
||||
using MvvmCross.iOS.Views.Presenters.Attributes;
|
||||
using UIKit;
|
||||
|
||||
namespace MvvmCross.iOS.Views
|
||||
{
|
||||
public interface IMvxTabBarViewController
|
||||
{
|
||||
void ShowTabView(UIViewController viewController, string tabTitle, string tabIconName, string tabSelectedIconName = null, string tabAccessibilityIdentifier = null);
|
||||
|
||||
void ShowTabView(UIViewController viewController, string tabTitle, string tabIconName, string tabAccessibilityIdentifier = null);
|
||||
void ShowTabView(UIViewController viewController, MvxTabPresentationAttribute attribute);
|
||||
|
||||
bool ShowChildView(UIViewController viewController);
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using MvvmCross.Core.ViewModels;
|
||||
using MvvmCross.iOS.Views.Presenters;
|
||||
using MvvmCross.iOS.Views.Presenters.Attributes;
|
||||
using MvvmCross.Platform;
|
||||
using UIKit;
|
||||
|
||||
|
@ -34,19 +35,13 @@ namespace MvvmCross.iOS.Views
|
|||
}
|
||||
}
|
||||
|
||||
//keep changes for selected icon from breaking current release
|
||||
public virtual void ShowTabView(UIViewController viewController, string tabTitle, string tabIconName, string tabAccessibilityIdentifier = null)
|
||||
public virtual void ShowTabView(UIViewController viewController, MvxTabPresentationAttribute attribute)
|
||||
{
|
||||
ShowTabView(viewController, tabTitle, tabIconName, null, tabAccessibilityIdentifier);
|
||||
}
|
||||
|
||||
public virtual void ShowTabView(UIViewController viewController, string tabTitle, string tabIconName, string tabSelectedIconName = null, string tabAccessibilityIdentifier = null)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(tabAccessibilityIdentifier))
|
||||
viewController.View.AccessibilityIdentifier = tabAccessibilityIdentifier;
|
||||
if (!string.IsNullOrEmpty(attribute.TabAccessibilityIdentifier))
|
||||
viewController.View.AccessibilityIdentifier = attribute.TabAccessibilityIdentifier;
|
||||
|
||||
// setup Tab
|
||||
SetTitleAndTabBarItem(viewController, tabTitle, tabIconName, tabSelectedIconName);
|
||||
SetTitleAndTabBarItem(viewController, attribute);
|
||||
|
||||
// add Tab
|
||||
var currentTabs = new List<UIViewController>();
|
||||
|
@ -61,28 +56,22 @@ namespace MvvmCross.iOS.Views
|
|||
ViewControllers = currentTabs.ToArray();
|
||||
}
|
||||
|
||||
//keep changes for selected icon from breaking current release
|
||||
protected virtual void SetTitleAndTabBarItem(UIViewController viewController, string title, string iconName)
|
||||
protected virtual void SetTitleAndTabBarItem(UIViewController viewController, MvxTabPresentationAttribute attribute)
|
||||
{
|
||||
_tabsCount++;
|
||||
|
||||
viewController.Title = title;
|
||||
viewController.Title = attribute.TabName;
|
||||
|
||||
if (!string.IsNullOrEmpty(iconName))
|
||||
viewController.TabBarItem = new UITabBarItem(title, UIImage.FromBundle(iconName), _tabsCount);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(attribute.TabIconName))
|
||||
viewController.TabBarItem = new UITabBarItem(attribute.TabName, UIImage.FromBundle(attribute.TabIconName), _tabsCount);
|
||||
|
||||
protected virtual void SetTitleAndTabBarItem(UIViewController viewController, string title, string iconName, string selectedIconName)
|
||||
{
|
||||
SetTitleAndTabBarItem(viewController, title, iconName);
|
||||
|
||||
if (!string.IsNullOrEmpty(selectedIconName))
|
||||
viewController.TabBarItem.SelectedImage = UIImage.FromBundle(selectedIconName);
|
||||
if (!string.IsNullOrEmpty(attribute.TabSelectedIconName))
|
||||
viewController.TabBarItem.SelectedImage = UIImage.FromBundle(attribute.TabSelectedIconName);
|
||||
}
|
||||
|
||||
public virtual bool ShowChildView(UIViewController viewController)
|
||||
{
|
||||
var navigationController = (UINavigationController)SelectedViewController;
|
||||
var navigationController = SelectedViewController as UINavigationController;
|
||||
|
||||
// if the current selected ViewController is not a NavigationController, then a child cannot be shown
|
||||
if (navigationController == null)
|
||||
|
@ -105,7 +94,21 @@ namespace MvvmCross.iOS.Views
|
|||
var navController = SelectedViewController as UINavigationController;
|
||||
if (navController != null)
|
||||
{
|
||||
navController.PopViewController(true);
|
||||
var root = navController.ViewControllers.FirstOrDefault();
|
||||
|
||||
// check if the ViewModel to close is the Root of the Navigation Stack,
|
||||
// otherwise pop the last in stack
|
||||
if (root != null
|
||||
&& root is IMvxIosView iosView
|
||||
&& iosView.ViewModel == viewModel)
|
||||
{
|
||||
RemoveTabController(navController);
|
||||
}
|
||||
else
|
||||
{
|
||||
navController.PopViewController(true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -115,8 +118,7 @@ namespace MvvmCross.iOS.Views
|
|||
.FirstOrDefault(mvxView => mvxView.ViewModel == viewModel);
|
||||
if (toClose != null)
|
||||
{
|
||||
var newTabs = ViewControllers.Where(v => v.GetIMvxIosView() != toClose);
|
||||
ViewControllers = newTabs.ToArray();
|
||||
RemoveTabController((UIViewController)toClose);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -127,6 +129,12 @@ namespace MvvmCross.iOS.Views
|
|||
{
|
||||
PresentViewController(new UINavigationController(controller), animated, completionHandler);
|
||||
}
|
||||
|
||||
protected virtual void RemoveTabController(UIViewController toClose)
|
||||
{
|
||||
var newTabs = ViewControllers.Where(v => v != toClose);
|
||||
ViewControllers = newTabs.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
public class MvxTabBarViewController<TViewModel> : MvxTabBarViewController
|
||||
|
|
|
@ -111,46 +111,56 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
MvxRootPresentationAttribute attribute,
|
||||
MvxViewModelRequest request)
|
||||
{
|
||||
// first set the new RootViewController
|
||||
if (attribute.WrapInNavigationController)
|
||||
{
|
||||
// viewController is initializing a navigation stack
|
||||
|
||||
var navigationController = CreateNavigationController(viewController);
|
||||
MasterNavigationController = navigationController as MvxNavigationController;
|
||||
SetWindowRootViewController(navigationController);
|
||||
}
|
||||
else
|
||||
{
|
||||
// set plain ViewController as root
|
||||
|
||||
SetWindowRootViewController(viewController);
|
||||
|
||||
CloseMasterNavigationController();
|
||||
}
|
||||
|
||||
// check if viewController is a TabBarController
|
||||
if (viewController is IMvxTabBarViewController tabBarController)
|
||||
{
|
||||
TabBarViewController = tabBarController;
|
||||
|
||||
// set root
|
||||
SetupWindowRootNavigation(viewController, attribute);
|
||||
|
||||
CleanupModalViewControllers();
|
||||
CloseSplitViewController();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// check if viewController is a SplitViewController
|
||||
else if (viewController is IMvxSplitViewController splitController)
|
||||
if (viewController is IMvxSplitViewController splitController)
|
||||
{
|
||||
SplitViewController = splitController;
|
||||
|
||||
// set root
|
||||
SetupWindowRootNavigation(viewController, attribute);
|
||||
|
||||
CleanupModalViewControllers();
|
||||
CloseTabBarViewController();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// set root initiating stack navigation or just a plain controller
|
||||
SetupWindowRootNavigation(viewController, attribute);
|
||||
|
||||
CleanupModalViewControllers();
|
||||
CloseTabBarViewController();
|
||||
CloseSplitViewController();
|
||||
}
|
||||
|
||||
protected void SetupWindowRootNavigation(UIViewController viewController, MvxRootPresentationAttribute attribute)
|
||||
{
|
||||
if (attribute.WrapInNavigationController)
|
||||
{
|
||||
MasterNavigationController = CreateNavigationController(viewController);
|
||||
|
||||
SetWindowRootViewController(MasterNavigationController);
|
||||
}
|
||||
else
|
||||
{
|
||||
CloseTabBarViewController();
|
||||
CloseSplitViewController();
|
||||
}
|
||||
SetWindowRootViewController(viewController);
|
||||
|
||||
// always clean ModalViewControllers when setting a new root
|
||||
CleanupModalViewControllers();
|
||||
CloseMasterNavigationController();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void ShowChildViewController(
|
||||
|
@ -182,7 +192,7 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
|
||||
if (MasterNavigationController != null)
|
||||
{
|
||||
PushViewControllerIntoStack(MasterNavigationController, viewController, attribute.Animated);
|
||||
PushViewControllerIntoStack(MasterNavigationController, viewController, attribute.Animated);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -197,15 +207,11 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
if (TabBarViewController == null)
|
||||
throw new MvxException("Trying to show a tab without a TabBarViewController, this is not possible!");
|
||||
|
||||
string tabName = attribute.TabName;
|
||||
string tabIconName = attribute.TabIconName;
|
||||
string tabSelectedIconName = attribute.TabSelectedIconName;
|
||||
|
||||
if (viewController is IMvxTabBarItemViewController tabBarItem)
|
||||
{
|
||||
tabName = tabBarItem.TabName;
|
||||
tabIconName = tabBarItem.TabIconName;
|
||||
tabSelectedIconName = tabBarItem.TabSelectedIconName;
|
||||
attribute.TabName = tabBarItem.TabName;
|
||||
attribute.TabIconName = tabBarItem.TabIconName;
|
||||
attribute.TabSelectedIconName = tabBarItem.TabSelectedIconName;
|
||||
}
|
||||
|
||||
if (attribute.WrapInNavigationController)
|
||||
|
@ -213,10 +219,7 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
|
||||
TabBarViewController.ShowTabView(
|
||||
viewController,
|
||||
tabName,
|
||||
tabIconName,
|
||||
tabSelectedIconName,
|
||||
attribute.TabAccessibilityIdentifier);
|
||||
attribute);
|
||||
}
|
||||
|
||||
protected virtual void ShowModalViewController(
|
||||
|
@ -371,12 +374,15 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
if (MasterNavigationController == null)
|
||||
return;
|
||||
|
||||
foreach (var item in MasterNavigationController.ViewControllers)
|
||||
item.DidMoveToParentViewController(null);
|
||||
if (MasterNavigationController.ViewControllers != null)
|
||||
{
|
||||
foreach (var item in MasterNavigationController.ViewControllers)
|
||||
item.DidMoveToParentViewController(null);
|
||||
}
|
||||
MasterNavigationController = null;
|
||||
}
|
||||
|
||||
protected void CloseModalViewController(UIViewController modalController)
|
||||
protected virtual void CloseModalViewController(UIViewController modalController)
|
||||
{
|
||||
if (modalController == null)
|
||||
return;
|
||||
|
@ -404,8 +410,12 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
if (TabBarViewController == null)
|
||||
return;
|
||||
|
||||
foreach (var item in (TabBarViewController as UITabBarController).ViewControllers)
|
||||
item.DidMoveToParentViewController(null);
|
||||
if (TabBarViewController is UITabBarController tabsController
|
||||
&& tabsController.ViewControllers != null)
|
||||
{
|
||||
foreach (var item in tabsController.ViewControllers)
|
||||
item.DidMoveToParentViewController(null);
|
||||
}
|
||||
TabBarViewController = null;
|
||||
}
|
||||
|
||||
|
@ -414,8 +424,12 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
if (SplitViewController == null)
|
||||
return;
|
||||
|
||||
foreach (var item in (SplitViewController as UISplitViewController).ViewControllers)
|
||||
item.DidMoveToParentViewController(null);
|
||||
if (SplitViewController is UISplitViewController splitController
|
||||
&& splitController.ViewControllers != null)
|
||||
{
|
||||
foreach (var item in splitController.ViewControllers)
|
||||
item.DidMoveToParentViewController(null);
|
||||
}
|
||||
SplitViewController = null;
|
||||
}
|
||||
|
||||
|
@ -424,7 +438,6 @@ namespace MvvmCross.iOS.Views.Presenters
|
|||
foreach (var v in _window.Subviews)
|
||||
v.RemoveFromSuperview();
|
||||
|
||||
_window.AddSubview(controller.View);
|
||||
_window.RootViewController = controller;
|
||||
}
|
||||
|
||||
|
|
|
@ -48,6 +48,8 @@
|
|||
<Compile Include="ViewModels\ViewModelA.cs" />
|
||||
<Compile Include="ViewModels\ViewModelB.cs" />
|
||||
<Compile Include="ViewModels\ViewModelC.cs" />
|
||||
<Compile Include="ViewModels\TestCViewModel.cs" />
|
||||
<Compile Include="RoutingFacades\PrePopulateRoutingFacade.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\MvvmCross\Platform\Platform\MvvmCross.Platform.csproj">
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using MvvmCross.Core.Navigation;
|
||||
using MvvmCross.Core.ViewModels;
|
||||
using RoutingExample.Core.RoutingFacades;
|
||||
using RoutingExample.Core.ViewModels;
|
||||
|
||||
[assembly: MvxNavigation(typeof(PrePopulateRoutingFacade), @"mvx://prepop")]
|
||||
|
||||
namespace RoutingExample.Core.RoutingFacades
|
||||
{
|
||||
public class PrePopulateRoutingFacade
|
||||
: IMvxNavigationFacade
|
||||
{
|
||||
public Task<MvxViewModelRequest> BuildViewModelRequest(string url, IDictionary<string, string> currentParameters)
|
||||
{
|
||||
var viewModelType = typeof(TestCViewModel);
|
||||
|
||||
var testKey = "viewmodelcparameter";
|
||||
if (currentParameters.ContainsKey(testKey))
|
||||
{
|
||||
currentParameters.Remove(testKey);
|
||||
}
|
||||
currentParameters.Add(testKey, "this is set from the navigation facade");
|
||||
|
||||
return Task.FromResult(new MvxViewModelRequest(viewModelType, new MvxBundle(currentParameters), null));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -66,5 +66,18 @@ namespace RoutingExample.Core.ViewModels
|
|||
}));
|
||||
}
|
||||
}
|
||||
|
||||
private IMvxCommand _showPrePopCommand;
|
||||
|
||||
public IMvxCommand ShowPrePopCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
return _showPrePopCommand ?? (_showPrePopCommand = new MvxAsyncCommand(async () =>
|
||||
{
|
||||
await _navigationService.Navigate("mvx://prepop");
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
using System.Threading.Tasks;
|
||||
using MvvmCross.Core.Navigation;
|
||||
using MvvmCross.Core.ViewModels;
|
||||
using MvvmCross.Platform;
|
||||
using RoutingExample.Core.ViewModels;
|
||||
|
||||
namespace RoutingExample.Core.ViewModels
|
||||
{
|
||||
public class TestCViewModel
|
||||
: MvxViewModel<User, User>
|
||||
{
|
||||
private readonly IMvxNavigationService _navigationService;
|
||||
public TestCViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
_navigationService = navigationService;
|
||||
}
|
||||
|
||||
private string _parameter;
|
||||
public string Parameter
|
||||
{
|
||||
get { return _parameter; }
|
||||
set { SetProperty(ref _parameter, value); }
|
||||
}
|
||||
|
||||
public void Init(string viewmodelcparameter)
|
||||
{
|
||||
Parameter = viewmodelcparameter;
|
||||
_user = new User($"Initial view {GetHashCode()}", "Test");
|
||||
}
|
||||
|
||||
private User _user;
|
||||
|
||||
public IMvxAsyncCommand CloseViewModelCommand => new MvxAsyncCommand(
|
||||
() => _navigationService.Close(this, new User("Return result", "Something")));
|
||||
|
||||
public override void Prepare(User parameter)
|
||||
{
|
||||
_user = parameter;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12120" systemVersion="16E195" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="5">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12120" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="5">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12088"/>
|
||||
<capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
|
||||
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
|
@ -14,27 +20,33 @@
|
|||
<viewControllerLayoutGuide type="bottom" id="3"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="6">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9">
|
||||
<rect key="frame" x="15" y="74" width="570" height="30"/>
|
||||
<rect key="frame" x="15" y="74" width="345" height="30"/>
|
||||
<state key="normal" title="mvx://test/a">
|
||||
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</state>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="10">
|
||||
<rect key="frame" x="15" y="134" width="570" height="30"/>
|
||||
<rect key="frame" x="15" y="134" width="345" height="30"/>
|
||||
<state key="normal" title="mvx://test/b">
|
||||
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</state>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="11">
|
||||
<rect key="frame" x="15" y="194" width="570" height="30"/>
|
||||
<rect key="frame" x="15" y="194" width="345" height="30"/>
|
||||
<state key="normal" title="mvx://random">
|
||||
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</state>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4CL-wn-i6a">
|
||||
<rect key="frame" x="15" y="254" width="345" height="30"/>
|
||||
<state key="normal" title="mvx://prepop">
|
||||
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</state>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
|
@ -47,10 +59,14 @@
|
|||
<constraint firstItem="11" firstAttribute="leading" secondItem="6" secondAttribute="leading" constant="15" id="18"/>
|
||||
<constraint firstAttribute="trailing" secondItem="11" secondAttribute="trailing" constant="15" id="20"/>
|
||||
<constraint firstItem="9" firstAttribute="top" secondItem="2" secondAttribute="bottom" constant="54" id="21"/>
|
||||
<constraint firstItem="4CL-wn-i6a" firstAttribute="trailing" secondItem="11" secondAttribute="trailing" id="TGw-3F-9ZG"/>
|
||||
<constraint firstItem="4CL-wn-i6a" firstAttribute="top" secondItem="11" secondAttribute="bottom" constant="30" id="qNS-gg-Fs8"/>
|
||||
<constraint firstItem="4CL-wn-i6a" firstAttribute="leading" secondItem="11" secondAttribute="leading" id="yPH-Um-2Z8"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<navigationItem key="navigationItem" title="Example" id="201"/>
|
||||
<connections>
|
||||
<outlet property="BtnPrePop" destination="4CL-wn-i6a" id="lG0-59-5en"/>
|
||||
<outlet property="BtnRandom" destination="11" id="name-outlet-11"/>
|
||||
<outlet property="BtnTestA" destination="9" id="name-outlet-9"/>
|
||||
<outlet property="BtnTestB" destination="10" id="name-outlet-10"/>
|
||||
|
@ -69,7 +85,7 @@
|
|||
<viewControllerLayoutGuide type="bottom" id="27"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="30">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" misplaced="YES" text="A" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="33">
|
||||
|
@ -105,7 +121,7 @@
|
|||
<viewControllerLayoutGuide type="bottom" id="55"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="48">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" misplaced="YES" text="B" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="49">
|
||||
|
@ -119,7 +135,7 @@
|
|||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="207" translatesAutoresizingMaskIntoConstraints="NO" fixedFrame="YES">
|
||||
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="207">
|
||||
<rect key="frame" x="170" y="285" width="259" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<state key="normal" title="Close with Result">
|
||||
|
@ -142,5 +158,70 @@
|
|||
</objects>
|
||||
<point key="canvasLocation" x="238" y="603"/>
|
||||
</scene>
|
||||
<!--Example C-->
|
||||
<scene sceneID="zgi-gS-Z0L">
|
||||
<objects>
|
||||
<viewController storyboardIdentifier="TestCViewController" title="Example C" id="Yyt-ZP-EJU" customClass="TestCViewController" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="9th-Se-wdV"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="Ew0-Yf-v0h"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="c5L-db-Fbi">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" misplaced="YES" text="C" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="rgV-oF-Hux">
|
||||
<rect key="frame" x="208" y="192" width="132" height="125"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="150" id="46h-Ar-j2N"/>
|
||||
<constraint firstAttribute="width" constant="150" id="eGA-pJ-mpW"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="150"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="v6C-GC-KuY">
|
||||
<rect key="frame" x="170" y="285" width="259" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<state key="normal" title="Close with Result">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Parameter" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ylb-DU-MoP">
|
||||
<rect key="frame" x="16" y="84" width="171.5" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Value" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OZO-OP-O3P">
|
||||
<rect key="frame" x="187.5" y="84" width="171.5" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="0.40000000600000002" blue="0.40000000600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="centerX" secondItem="rgV-oF-Hux" secondAttribute="centerX" id="2r8-S1-bPj"/>
|
||||
<constraint firstItem="ylb-DU-MoP" firstAttribute="leading" secondItem="c5L-db-Fbi" secondAttribute="leadingMargin" id="OuK-HN-SaX"/>
|
||||
<constraint firstAttribute="centerX" secondItem="ylb-DU-MoP" secondAttribute="trailing" id="PPF-T6-P2J"/>
|
||||
<constraint firstItem="rgV-oF-Hux" firstAttribute="centerY" secondItem="c5L-db-Fbi" secondAttribute="centerY" id="Wy6-Id-Oht"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="OZO-OP-O3P" secondAttribute="trailing" id="XSf-Yz-gO1"/>
|
||||
<constraint firstItem="OZO-OP-O3P" firstAttribute="leading" secondItem="ylb-DU-MoP" secondAttribute="trailing" id="bbz-cv-LLA"/>
|
||||
<constraint firstItem="ylb-DU-MoP" firstAttribute="top" secondItem="9th-Se-wdV" secondAttribute="bottom" constant="20" id="csg-TM-oHK"/>
|
||||
<constraint firstItem="OZO-OP-O3P" firstAttribute="top" secondItem="ylb-DU-MoP" secondAttribute="top" id="xTt-om-NdD"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||
<connections>
|
||||
<outlet property="CloseButton" destination="v6C-GC-KuY" id="tL5-hc-IxQ"/>
|
||||
<outlet property="ValueLabel" destination="OZO-OP-O3P" id="9Gl-q7-RwC"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="DzS-qQ-uwv" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="983" y="600"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
</document>
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace RoutingExample.iOS
|
|||
set.Bind(BtnTestA).To(vm => vm.ShowACommand);
|
||||
set.Bind(BtnTestB).To(vm => vm.ShowBCommand);
|
||||
set.Bind(BtnRandom).To(vm => vm.ShowRandomCommand);
|
||||
set.Bind(BtnPrePop).To(vm => vm.ShowPrePopCommand);
|
||||
|
||||
set.Apply();
|
||||
|
||||
|
|
|
@ -1,47 +1,57 @@
|
|||
// WARNING
|
||||
//
|
||||
// This file has been generated automatically by Xamarin Studio from the outlets and
|
||||
// actions declared in your storyboard file.
|
||||
// Manual changes to this file will not be maintained.
|
||||
// This file has been generated automatically by Visual Studio to store outlets and
|
||||
// actions made in the UI designer. If it is removed, they will be lost.
|
||||
// Manual changes to this file may not be handled correctly.
|
||||
//
|
||||
using Foundation;
|
||||
using System;
|
||||
using System.CodeDom.Compiler;
|
||||
using UIKit;
|
||||
|
||||
namespace RoutingExample.iOS
|
||||
{
|
||||
[Register ("MainViewController")]
|
||||
[Register("MainViewController")]
|
||||
partial class MainViewController
|
||||
{
|
||||
[Outlet]
|
||||
[GeneratedCode ("iOS Designer", "1.0")]
|
||||
UIKit.UIButton BtnPrePop { get; set; }
|
||||
|
||||
[Outlet]
|
||||
[GeneratedCode("iOS Designer", "1.0")]
|
||||
UIKit.UIButton BtnRandom { get; set; }
|
||||
|
||||
[Outlet]
|
||||
[GeneratedCode ("iOS Designer", "1.0")]
|
||||
[GeneratedCode("iOS Designer", "1.0")]
|
||||
UIKit.UIButton BtnTestA { get; set; }
|
||||
|
||||
[Outlet]
|
||||
[GeneratedCode ("iOS Designer", "1.0")]
|
||||
[GeneratedCode("iOS Designer", "1.0")]
|
||||
UIKit.UIButton BtnTestB { get; set; }
|
||||
|
||||
void ReleaseDesignerOutlets ()
|
||||
void ReleaseDesignerOutlets()
|
||||
{
|
||||
if (BtnRandom != null) {
|
||||
BtnRandom.Dispose ();
|
||||
if (BtnRandom != null)
|
||||
{
|
||||
BtnRandom.Dispose();
|
||||
BtnRandom = null;
|
||||
}
|
||||
|
||||
if (BtnTestA != null) {
|
||||
BtnTestA.Dispose ();
|
||||
if (BtnTestA != null)
|
||||
{
|
||||
BtnTestA.Dispose();
|
||||
BtnTestA = null;
|
||||
}
|
||||
|
||||
if (BtnTestB != null) {
|
||||
BtnTestB.Dispose ();
|
||||
if (BtnTestB != null)
|
||||
{
|
||||
BtnTestB.Dispose();
|
||||
BtnTestB = null;
|
||||
}
|
||||
|
||||
if (BtnPrePop != null)
|
||||
{
|
||||
BtnPrePop.Dispose();
|
||||
BtnPrePop = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,6 +110,10 @@
|
|||
<SubType>Designer</SubType>
|
||||
</Content>
|
||||
<InterfaceDefinition Include="Main.storyboard" />
|
||||
<Compile Include="TestCViewController.cs" />
|
||||
<Compile Include="TestCViewController.designer.cs">
|
||||
<DependentUpon>TestCViewController.cs</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using MvvmCross.Binding.BindingContext;
|
||||
using MvvmCross.iOS.Views;
|
||||
using MvvmCross.iOS.Views.Presenters.Attributes;
|
||||
using RoutingExample.Core.ViewModels;
|
||||
using UIKit;
|
||||
|
||||
namespace RoutingExample.iOS
|
||||
{
|
||||
[MvxFromStoryboard("Main")]
|
||||
[MvxChildPresentation]
|
||||
public partial class TestCViewController : MvxViewController<TestCViewModel>
|
||||
{
|
||||
public TestCViewController(IntPtr handle) : base(handle)
|
||||
{
|
||||
}
|
||||
|
||||
public override void ViewDidLoad()
|
||||
{
|
||||
base.ViewDidLoad();
|
||||
var set = this.CreateBindingSet<TestCViewController, TestCViewModel>();
|
||||
set.Bind(CloseButton).To(vm => vm.CloseViewModelCommand);
|
||||
set.Bind(ValueLabel).To(vm => vm.Parameter);
|
||||
set.Apply();
|
||||
}
|
||||
}
|
||||
}
|
34
TestProjects/Navigation/RoutingExample.iOS/TestCViewController.designer.cs
сгенерированный
Normal file
34
TestProjects/Navigation/RoutingExample.iOS/TestCViewController.designer.cs
сгенерированный
Normal file
|
@ -0,0 +1,34 @@
|
|||
// WARNING
|
||||
//
|
||||
// This file has been generated automatically by Visual Studio to store outlets and
|
||||
// actions made in the UI designer. If it is removed, they will be lost.
|
||||
// Manual changes to this file may not be handled correctly.
|
||||
//
|
||||
using Foundation;
|
||||
using System.CodeDom.Compiler;
|
||||
|
||||
namespace RoutingExample.iOS
|
||||
{
|
||||
[Register ("TestCViewController")]
|
||||
partial class TestCViewController
|
||||
{
|
||||
[Outlet]
|
||||
UIKit.UIButton CloseButton { get; set; }
|
||||
|
||||
[Outlet]
|
||||
UIKit.UILabel ValueLabel { get; set; }
|
||||
|
||||
void ReleaseDesignerOutlets ()
|
||||
{
|
||||
if (CloseButton != null) {
|
||||
CloseButton.Dispose ();
|
||||
CloseButton = null;
|
||||
}
|
||||
|
||||
if (ValueLabel != null) {
|
||||
ValueLabel.Dispose ();
|
||||
ValueLabel = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -13,7 +13,7 @@ namespace Playground.Core
|
|||
.AsInterfaces()
|
||||
.RegisterAsLazySingleton();
|
||||
|
||||
RegisterAppStart<RootViewModel>();
|
||||
RegisterNavigationServiceAppStart<RootViewModel>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
using System.Threading.Tasks;
|
||||
using System;
|
||||
using System;
|
||||
using System.Windows.Input;
|
||||
using MvvmCross.Core.Navigation;
|
||||
using MvvmCross.Core.ViewModels;
|
||||
|
@ -20,9 +20,9 @@ namespace Playground.Core.ViewModels
|
|||
|
||||
private async Task ShowInitialViewModels()
|
||||
{
|
||||
await _navigationService.Navigate<Tab1ViewModel, string>("test").ConfigureAwait(false);
|
||||
await _navigationService.Navigate<Tab2ViewModel>().ConfigureAwait(false);
|
||||
await _navigationService.Navigate<Tab3ViewModel>().ConfigureAwait(false);
|
||||
await _navigationService.Navigate<Tab1ViewModel, string>("test");
|
||||
await _navigationService.Navigate<Tab2ViewModel>();
|
||||
await _navigationService.Navigate<Tab3ViewModel>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,15 +29,15 @@ namespace Playground.iOS.Views
|
|||
}
|
||||
}
|
||||
|
||||
protected override void SetTitleAndTabBarItem(UIViewController viewController, string title, string iconName)
|
||||
protected override void SetTitleAndTabBarItem(UIViewController viewController, MvxTabPresentationAttribute attribute)
|
||||
{
|
||||
// you can override this method to set title or iconName
|
||||
if (string.IsNullOrEmpty(title))
|
||||
title = "Tab 2";
|
||||
if (string.IsNullOrEmpty(iconName))
|
||||
iconName = "ic_tabbar_menu";
|
||||
if (string.IsNullOrEmpty(attribute.TabName))
|
||||
attribute.TabName = "Tab 2";
|
||||
if (string.IsNullOrEmpty(attribute.TabIconName))
|
||||
attribute.TabIconName = "ic_tabbar_menu";
|
||||
|
||||
base.SetTitleAndTabBarItem(viewController, title, iconName);
|
||||
base.SetTitleAndTabBarItem(viewController, attribute);
|
||||
}
|
||||
|
||||
public override bool ShowChildView(UIViewController viewController)
|
||||
|
|
|
@ -1,5 +1,13 @@
|
|||
# MvvmCross site changelog
|
||||
|
||||
## Mvxtheme 1.5 (2017-08-03)
|
||||
|
||||
* Add XABLU and Microsoft logo.
|
||||
|
||||
* Fix button styles and add logo styles.
|
||||
|
||||
* Fix some tag bug, add logos, remove unused javascript
|
||||
|
||||
## Mvxtheme 1.4 (2017-07-29)
|
||||
|
||||
* Add member list table.
|
||||
|
|
|
@ -37,6 +37,7 @@ If you want to initiate a stack navigation, just set the attribute member `WrapI
|
|||
### MvxChildPresentationAttribute
|
||||
Used to set a view as a _child_. You should use this attribute over a view class that will be displayed inside a navigation stack (modal or not).
|
||||
The view class can decide if wants to be displayed animated or not through the attribute member `Animated` (the default value is `true`).
|
||||
If your app uses a TabBarController as a child ViewController of a "master" NavigationController, you can decide whether to display a new child ViewController inside a Tab of the TabBarViewController (assuming that Tab is a NavigationController) or to display it as a child of the "master" NavigationController. You can take control of this behavior by overriding `MvxTabBarController.ShowChildView`.
|
||||
|
||||
|
||||
### MvxModalPresentationAttribute
|
||||
|
@ -57,6 +58,7 @@ The presentation can be highly customized through this attribute members:
|
|||
|
||||
- TabName: Defines the title of the tab that will be displayed below the tab icon. It has to be a magic string, but it can be for example a key to a localized string that you can grab overriding the method `SetTitleAndTabBarItem` in your TabBarController.
|
||||
- TabIconName: Defines the name of the resource that will be used as icon for the tab. It also has to be a magic string, but same as before, your app can take control of what happens by overriding the method `SetTitleAndTabBarItem` in your TabBarController.
|
||||
- TabSelectedIconName: Defines the name of the resource that will be used as icon for the tab when it becomes selected. It also has to be a magic string, your app can take control of what happens by overriding the method `SetTitleAndTabBarItem` in your TabBarController.
|
||||
- WrapInNavigationController: If set to `true`, the view will be wrapped in a `MvxNavigationController`, which will allow the tab to have its own navigation stack. **Important note**: When the current _Root_ is a TabBarController and there is no current modal navigation stack, child presentations will be tried to be displayed in the current selected _Tab_.
|
||||
- TabAccessibilityIdentifier: Corresponds to the UIViewController.View `AccessibilityIdentifier` property.
|
||||
|
||||
|
|
|
@ -45,53 +45,49 @@
|
|||
margin: 0;
|
||||
}
|
||||
}
|
||||
> .sign-up {
|
||||
background-color: $brand-color;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
border-radius: 4px;
|
||||
padding: 8px 16px;
|
||||
font-weight: $base-font-weight;
|
||||
color: #FAFAFA;
|
||||
text-decoration: none;
|
||||
text-transform: uppercase;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
// start-button hover effect
|
||||
&:hover {
|
||||
background-color: darken($brand-color, 5%);
|
||||
}
|
||||
// start-button active effect
|
||||
&:active {
|
||||
background-color: $brand-color;
|
||||
}
|
||||
}
|
||||
> .info {
|
||||
display: flex;
|
||||
display: -webkit-flex;
|
||||
flex-flow: row wrap;
|
||||
justify-content: space-around;
|
||||
.main-content {
|
||||
width: 42%;
|
||||
flex-flow: column wrap;
|
||||
.companie-logos {
|
||||
display: flex;
|
||||
display: -webkit-flex;
|
||||
flex-flow: row wrap;
|
||||
justify-content: space-around;
|
||||
img {
|
||||
height: 50px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
.line {
|
||||
border-left: 1px solid $text-color;
|
||||
height: 300px;
|
||||
.sign-up {
|
||||
align-self: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.goals .golas-list {
|
||||
list-style: none;
|
||||
font-size: 1.25rem;
|
||||
padding-left: 0;
|
||||
}
|
||||
.goals .golas-list li::before {
|
||||
content: "\f024";
|
||||
font-family: FontAwesome;
|
||||
font-size: inherit;
|
||||
display: inline-block;
|
||||
margin-right: 8px;
|
||||
.info-content {
|
||||
display: flex;
|
||||
display: -webkit-flex;
|
||||
flex-flow: row wrap;
|
||||
justify-content: space-around;
|
||||
.main-content {
|
||||
width: 42%;
|
||||
}
|
||||
.line {
|
||||
border-left: 1px solid $text-color;
|
||||
height: 300px;
|
||||
align-self: center;
|
||||
}
|
||||
.goals .golas-list {
|
||||
list-style: none;
|
||||
font-size: 1.25rem;
|
||||
padding-left: 0;
|
||||
}
|
||||
.goals .golas-list li::before {
|
||||
content: "\f024";
|
||||
font-family: FontAwesome;
|
||||
font-size: inherit;
|
||||
display: inline-block;
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
> .take-part-in {
|
||||
|
@ -284,6 +280,28 @@
|
|||
p {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
.sign-up {
|
||||
background-color: $brand-color;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
border-radius: 4px;
|
||||
padding: 8px 16px;
|
||||
font-weight: $base-font-weight;
|
||||
color: #FAFAFA;
|
||||
text-decoration: none;
|
||||
text-transform: uppercase;
|
||||
display: inline-block;
|
||||
cursor: pointer; // start-button hover effect
|
||||
&:hover {
|
||||
background-color: darken($brand-color, 5%);
|
||||
text-decoration: none;
|
||||
} // start-button active effect
|
||||
&:active {
|
||||
background-color: $brand-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
@include media-query-max($on-mobile) {
|
||||
.hackfest {
|
||||
|
@ -305,10 +323,12 @@
|
|||
}
|
||||
}
|
||||
> .info {
|
||||
.goals {
|
||||
.golas-list {
|
||||
li {
|
||||
font-size: 1rem;
|
||||
.info-content {
|
||||
.goals {
|
||||
.golas-list {
|
||||
li {
|
||||
font-size: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -347,10 +367,12 @@
|
|||
}
|
||||
}
|
||||
> .info {
|
||||
.goals {
|
||||
.golas-list {
|
||||
li {
|
||||
font-size: 1.25rem;
|
||||
.info-content {
|
||||
.goals {
|
||||
.golas-list {
|
||||
li {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -372,15 +394,17 @@
|
|||
@include media-query-max($on-desktop - 1) {
|
||||
.hackfest {
|
||||
> .info {
|
||||
flex-flow: column wrap;
|
||||
.main-content {
|
||||
width: 100%;
|
||||
}
|
||||
.line {
|
||||
border-left: 0;
|
||||
border-bottom: 1px solid $text-color;
|
||||
width: 100%;
|
||||
height: 0;
|
||||
.info-content {
|
||||
flex-flow: column wrap;
|
||||
.main-content {
|
||||
width: 100%;
|
||||
}
|
||||
.line {
|
||||
border-left: 0;
|
||||
border-bottom: 1px solid $text-color;
|
||||
width: 100%;
|
||||
height: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
> .take-part-in {
|
||||
|
|
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 39 KiB |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 12 KiB |
|
@ -15,25 +15,32 @@ permalink: /hackfest/
|
|||
</div>
|
||||
</section>
|
||||
<section class="info hackfest-padding">
|
||||
<div class="main-content">
|
||||
<h2 class="title">The .NET Summer Hackfest</h2>
|
||||
<p class="content">MvvmCross is one of the projects taking part in the inaugural <a href="https://dotnetfoundation.org/blog/announcing-net-summer-hackfest-2017">.NET Summer Hackfest</a>, organized by the .NET Foundation! Running for two weeks from August 21st to September 2nd, 2017, the MvvmCross session will see contributors from around the world work together virtually to build and improve the framework, with two exciting in-person events also planned! Participation is open to all, whether you’re a first-time or long-time contributor.</p>
|
||||
<div class="companie-logos">
|
||||
<img src="{{ '/assets/img/logo/MvvmCross-logo.png' | relative_url }}" alt="Logo">
|
||||
<img src="{{ '/assets/img/logo/dotnet-foundation-logo.png' | relative_url }}" alt="Logo">
|
||||
<img src="{{ '/assets/img/logo/logo-xablu-blue.png' | relative_url }}" alt="Logo">
|
||||
<img src="{{ '/assets/img/logo/Microsoft_logo.png' | relative_url }}" alt="Logo">
|
||||
</div>
|
||||
<a class="sign-up" href="https://www.eventbrite.com/e/mvvmcross-net-summer-hackfest-registration-36537277982">Register Now!</a>
|
||||
</div>
|
||||
<div class="line"></div>
|
||||
<div class="goals">
|
||||
<h2 class="title">The main goals are to:</h2>
|
||||
<ul class="golas-list">
|
||||
<li>Convert MvvmCross to the .NET Standard</li>
|
||||
<li>Update samples to latest version</li>
|
||||
<li>Add more async Task based code</li>
|
||||
<li>Update and create more website content</li>
|
||||
<li>Improve the documentation</li>
|
||||
<li>Work on up-for-grabs issues</li>
|
||||
<li>Join the .NET Foundation</li>
|
||||
</ul>
|
||||
<div class="info-content">
|
||||
<div class="main-content">
|
||||
<h2 class="title">The .NET Summer Hackfest</h2>
|
||||
<p class="content">MvvmCross is one of the projects taking part in the inaugural <a href="https://dotnetfoundation.org/blog/announcing-net-summer-hackfest-2017">.NET Summer Hackfest</a>, organized by the .NET Foundation! Running for two weeks from August 21st to September 2nd, 2017, the MvvmCross session will see contributors from around the world work together virtually to build and improve the framework, with two exciting in-person events also planned! Participation is open to all, whether you’re a first-time or long-time contributor.</p>
|
||||
</div>
|
||||
<div class="line"></div>
|
||||
<div class="goals">
|
||||
<h2 class="title">The main goals are to:</h2>
|
||||
<ul class="golas-list">
|
||||
<li>Convert MvvmCross to the .NET Standard</li>
|
||||
<li>Update samples to latest version</li>
|
||||
<li>Add more async Task based code</li>
|
||||
<li>Update and create more website content</li>
|
||||
<li>Improve the documentation</li>
|
||||
<li>Work on up-for-grabs issues</li>
|
||||
<li>Join the .NET Foundation</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<a class="sign-up" href="https://www.eventbrite.com/e/mvvmcross-net-summer-hackfest-registration-36537277982">Register Now!</a>
|
||||
</section>
|
||||
<section class="take-part-in hackfest-padding">
|
||||
<h1 class="text-center">Take part in the MvvmCross .NET Summer Hackfest!</h1>
|
||||
|
@ -46,7 +53,7 @@ permalink: /hackfest/
|
|||
<h2>How does it work?</h2>
|
||||
<p>We've created a new <a href="https://github.com/MvvmCross/MvvmCross/projects/2">GitHub project</a> which lists all of the tasks planned during the two week period. Once you register, you can ask to get assigned to an issue and make a pull request! The MvvmCross Core team will review any new issue and pull request as soon as possible in the two week hackfest to make the experience of contributing as smooth as possible.</p>
|
||||
</div>
|
||||
<div class="kickoff">
|
||||
<div class="kickoff">
|
||||
<h2>Virtual kickoff event</h2>
|
||||
<p>We’ll kick-off the hackfest together on Monday, August 21st at 19:00 CEST with a livestream hosted by MvvmCross lead contributor Martijn van Dijk. This will be a chance to ask questions and watch a demo on getting started!</p>
|
||||
</div>
|
||||
|
@ -81,8 +88,8 @@ permalink: /hackfest/
|
|||
</table>
|
||||
</div>
|
||||
<div class="widget">
|
||||
<iframe src="https://www.eventbrite.co.uk/countdown-widget?eid=36537277982" frameborder="0" height="381" width="195" marginheight="0"
|
||||
marginwidth="0" scrolling="no" allowtransparency="true"></iframe>
|
||||
<iframe src="https://www.eventbrite.co.uk/countdown-widget?eid=36537277982" frameborder="0" height="381" width="195"
|
||||
marginheight="0" marginwidth="0" scrolling="no" allowtransparency="true"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@ -95,30 +102,12 @@ permalink: /hackfest/
|
|||
<p>Join MvvmCross contributors from Europe and around the world for a full day dedicated to the extension! We’ll have a morning of talks from the MvvmCross leadership team, followed by an afternoon hackathon to finish off the two weeks of hard work!</p>
|
||||
</div>
|
||||
<a class="sign-up" href="https://www.eventbrite.com/e/mvvmcross-hackday-tickets-36684529415">RSVP</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</article>
|
||||
<script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
||||
<script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/jquery-footable/3.1.6/footable.min.js"></script>
|
||||
<script type='text/javascript' src='https://s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js'></script>
|
||||
<script type='text/javascript'>
|
||||
(function ($) {
|
||||
window.fnames = new Array();
|
||||
window.ftypes = new Array();
|
||||
fnames[0] = 'EMAIL';
|
||||
ftypes[0] = 'email';
|
||||
fnames[1] = 'FNAME';
|
||||
ftypes[1] = 'text';
|
||||
fnames[2] = 'LNAME';
|
||||
ftypes[2] = 'text';
|
||||
}(jQuery));
|
||||
var $mcj = jQuery.noConflict(true);
|
||||
jQuery(function($) {
|
||||
$('#member-list').footable();
|
||||
});
|
||||
|
|
Загрузка…
Ссылка в новой задаче