Merge pull request #2095 from Garfield550/hackfest2017

Update Hackfest 2017 page
This commit is contained in:
Martijn van Dijk 2017-08-03 13:35:29 +02:00 коммит произвёл GitHub
Родитель 392f243943 b851581e9c
Коммит 0c3b60b0e2
24 изменённых файлов: 501 добавлений и 208 удалений

Просмотреть файл

@ -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();
}
}
}

Просмотреть файл

@ -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 {

Двоичные данные
docs/assets/img/logo/Microsoft_logo.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 39 KiB

Двоичные данные
docs/assets/img/logo/logo-xablu-blue.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 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 youre 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 youre 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>Well 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! Well 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();
});