Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Да и посмотрите, как constraints описываются ручками.
но ради элементарной кастомизации внешнего вида кнопки нужно лезть в императивный код
Примерно как сейчас С++ QtНу я пробовал на Qt писать под Андроид! Да, это реально работает и совсем несложно. Но. Получившееся приложение — во первых знать ничего не желает о стилях, размере экрана, DPI и прочих нюансах интерфейса. Во-вторых практически ничего не может сделать с ОС — даже банальный Intent кинуть. Да можно, сделать гибридное приложение. Или использовать ужасный JNI. Но в чем тогда профит от кроссплатформенности? Мобильное приложение это процентов на 90 UI и связанные с ним вещи. А UI на сегодняшний момент, извините, только нативно можно сделать качественным и конкурентоспособным.
Кроме UI, есть ещё работа с сервисом, которая не зависит от платформы. Хранение данных, которое тоже не слишком-то зависит от платформы. Бизнес-логика, которая у большинства приложений от платформы зависит не сильноЭто и есть 10% трудозатрат.
Кроме того, для многих приложений вполне оправдано применение phonegap, где о нативности интерфейса вообще речи нет.На PhoneGap можно делать нативно выглядящий интерфейс — есть соответствующие виджеты. И да, в ряде случаев кроссплатформенные средства действительно предпочтительнее, я об этом недавно писал: habrahabr.ru/post/229559/#comment_7772177
Я имел ввиду кросплатформенность среди «целевых» платформ. Т.е. в случае Qt это возможность написать программу (desktop)Справедливости ради, Qt когда-то развивался именно как мобильный инструмент — для Symbian. Сейчас да, десктоп
Создать язык (и фрэймворк), который позволит писать программы вообще для всего (десктоп, мобаил, веб) — это вряд ли пока возможно, цена за универсальность будет высокой.Может и хорошо — есть конкуренция технологий, есть развитие. Хотя конечно было бы здорово иметь один мощный язык для всего.
Справедливости ради, Qt когда-то развивался именно как мобильный инструмент — для Symbian. Сейчас да, десктоп

Хотя HTML там в принципе был и раньше — если кто задавался вопросом, почему визарды для C++-проектов позволяют выделять произвольный текст в диалоге мышкой, то вот как раз поэтому.
ресайзить картинку налету в несколько типоразмеров
сохранять в кастомный кэш
ObjectCache cache = MemoryCache.Default;
string fileContents = cache["filecontents"] as string;
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<ListBox
DockPanel.Dock="Bottom"
ItemsSource="{Binding Selected}"
Height="150"
/>
<DataGrid ItemsSource="{Binding Collection}">
<i:Interaction.Behaviors>
<local:DependecyPropertyBehavior
UpdateEvent="SelectionChanged"
Property="SelectedItems"
Binding="{Binding Selected}"
/>
</i:Interaction.Behaviors>
</DataGrid>
</DockPanel>
</Window>
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
namespace WpfApplication1
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<object> _selected;
public ObservableCollection<object> Collection { get; set; }
public ObservableCollection<object> Selected
{
get { return _selected; }
set
{
_selected = value;
OnPropertyChanged("Selected");
}
}
public MainWindow()
{
InitializeComponent();
Collection = new ObservableCollection<object>
{
new { Col1 = "Hello11", Col2 = "Hello12", Col3 = "Hello13" },
new { Col1 = "Hello21", Col2 = "Hello22", Col3 = "Hello23" },
new { Col1 = "Hello31", Col2 = "Hello32", Col3 = "Hello33" },
new { Col1 = "Hello41", Col2 = "Hello42", Col3 = "Hello43" },
};
Selected = new ObservableCollection<object>();
DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
using System;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Windows;
using System.Windows.Interactivity;
using Expression = System.Linq.Expressions.Expression;
namespace WpfApplication1
{
public class DependecyPropertyBehavior : Behavior<DependencyObject>
{
private Delegate _handler;
private EventInfo _eventInfo;
private PropertyInfo _propertyInfo;
public static readonly DependencyProperty BindingProperty = DependencyProperty.RegisterAttached(
"Binding",
typeof(object),
typeof(DependecyPropertyBehavior),
new FrameworkPropertyMetadata { BindsTwoWayByDefault = true }
);
public object Binding
{
get { return GetValue(BindingProperty); }
set { SetValue(BindingProperty, value); }
}
public string Property { get; set; }
public string UpdateEvent { get; set; }
protected override void OnAttached()
{
Type elementType = AssociatedObject.GetType();
// Getting property.
if (Property == null)
{
PresentationTraceSources.DependencyPropertySource.TraceData(
TraceEventType.Error,
1,
"Target property not defined."
);
return;
}
_propertyInfo = elementType.GetProperty(Property, BindingFlags.Instance | BindingFlags.Public);
if (_propertyInfo == null)
{
PresentationTraceSources.DependencyPropertySource.TraceData(
TraceEventType.Error,
2,
string.Format("Property \"{0}\" not found.", Property)
);
return;
}
// Getting event.
if (UpdateEvent == null) return;
_eventInfo = elementType.GetEvent(UpdateEvent);
if (_eventInfo == null)
{
PresentationTraceSources.MarkupSource.TraceData(
TraceEventType.Error,
3,
string.Format("Event \"{0}\" not found.", UpdateEvent)
);
return;
}
_handler = CreateDelegateForEvent(_eventInfo, EventFired);
_eventInfo.AddEventHandler(AssociatedObject, _handler);
}
protected override void OnDetaching()
{
if (_eventInfo == null) return;
if (_handler == null) return;
_eventInfo.RemoveEventHandler(AssociatedObject, _handler);
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
if (e.Property.Name != "Binding") return;
if (AssociatedObject == null) return;
if (_propertyInfo == null) return;
object oldValue = _propertyInfo.GetValue(AssociatedObject, null);
if (oldValue.Equals(e.NewValue)) return;
if (_propertyInfo.CanWrite)
_propertyInfo.SetValue(AssociatedObject, e.NewValue, null);
base.OnPropertyChanged(e);
}
private static Delegate CreateDelegateForEvent(EventInfo eventInfo, Action action)
{
ParameterExpression[] parameters =
eventInfo
.EventHandlerType
.GetMethod("Invoke")
.GetParameters()
.Select(parameter => Expression.Parameter(parameter.ParameterType))
.ToArray();
return Expression.Lambda(
eventInfo.EventHandlerType,
Expression.Call(Expression.Constant(action), "Invoke", Type.EmptyTypes),
parameters
)
.Compile();
}
private void EventFired()
{
if (AssociatedObject == null) return;
if (_propertyInfo == null) return;
Binding = _propertyInfo.GetValue(AssociatedObject, null);
}
}
}
.Net framework установить в каталог с приложениемКуда-куда установить?
И кстати, с Винды-7 фрэймворк идёт в комплекте — ничего дополнительно устанавливать не нужно.
[AdminOnly]
public ActionResult ShowLogs() ...
[Required]
[ValidateString(Pattern = '...')]
[Label("Cell or work phone")]
public string Phone
<input type='hidden' value='@data["userid"]'> — я бы за рефакторинг схемы брался бы только основательно с бизнесом поторговавшись, за отдельную оплату.меньше работы, дешевле разработка, дешевле поддержкаМеньше заработок? :)
я регулярно рефакторю схему БД,Семь раз отмерь, один раз отрежь? :)
пробовали Вы сделать сложную декларативную графику без Microsoft Blend?
Но растр у Microsoft не делает десятой части того, что делает у Apple. В таком случае, в чем смысл?
Каждый кто программирует на Objective-C и на C# знает, что первый отставал от последнего на два десятка лет.
Каждый кто программирует на Objective-C и на C# знает, что первый отставал от последнего на два десятка лет.
С таким инструментом точно не возникнет желания наполнять аппстор чем-то полезным — слишком уж дорого эта польза даётся. Напомню, это мнение программиста на WPF/WinForms, так что ждём ответов из стана Apple!
не эти ли 20% разработчиков игр для App Store, которые получают 97% всех денег?1) Очень круто ссылаться в 2014 году на исследования 2011. Чуть-чуть свежая информация: 57% игр в магазинах приложений зарабатывают менее 500 долларов в месяц. но при этом 80% выручки в магазинах — от игр.
похоже Вы не знаете объемы денег этих самих «энтепрайзах».Вопрос в том — сколько из них попадет к c# разработчикам :) А объёмы знаю, т.к. сам из этого мира.
Apple держится за счет большой маржи,У MSFT маржа в 2 раза больше.
которая неизвестно сколько продержитсяМожет IBM поможет? :)
не возникнет желания наполнять аппстор чем-то полезным — слишком уж дорого эта польза даётся.
Чего ж так сложно, господа?.. предложите ПРОСТОЙ СПОСОБ сделать аналогичное приложение. Если его нет — упаси небо, я никого винить не буду, будем считать, что Apple уделила недостаточное внимание удобству разработки
<DockPanel LastChildFill="True">
<Grid Width="70">
<Image DockPanel.Dock="Left" Source="{Binding artworkUrl60}" /><!-- никакой ручной работы - изображение загрузится само! -->
</Grid>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding trackName}" FontWeight="Bold" FontSize="20" Padding="4"/>
<TextBlock Text="{Binding formattedPrice}" FontSize="16" Padding="4" />
<Rectangle Stroke="LightGray" Height="2" Width="250" HorizontalAlignment="Center" />
</StackPanel>
</DockPanel>
<Grid Width="70">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="70"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Image Grid.Rowspan="3" Source="{Binding artworkUrl60}" /><!-- никакой ручной работы - изображение загрузится само! -->
<TextBlock Grid.Column="1" Text="{Binding trackName}" FontWeight="Bold" FontSize="20" Padding="4"/>
<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding formattedPrice}" FontSize="16" Padding="4" />
<Rectangle Grid.Column="1" Grid.Row="2" Stroke="LightGray" Height="2" Width="250" HorizontalAlignment="Center" />
</Grid>
Во-первых, они бестолково суммируются
iOS vs WPF — сложное против мелкомягкого