- این پوشه در سیستم من در این مسیر قرار دارد:
C:\Documents and Settings\vahid\My Documents\Visual Studio 2008\Addins
<div id="app"> <v-app id="inspire"> <v-layout> <v-flex xs12 sm6 offset-sm3> <v-card> <v-img height="200px" src="https://cdn.vuetifyjs.com/images/cards/docks.jpg"> <v-container fill-height fluid> <v-layout fill-height> <v-flex xs12 align-end flexbox> <span>Top 10 Australian beaches</span> </v-flex> </v-layout> </v-container> </v-img> <v-card-title> <div> <span>Number 10</span><br> <span>Whitehaven Beach</span><br> <span>Whitsunday Island, Whitsunday Islands</span> </div> </v-card-title> <v-card-actions> <v-btn flat color="orange">Share</v-btn> <v-btn flat color="orange">Explore</v-btn> </v-card-actions> </v-card> </v-flex> </v-layout> </v-app> </div>
<div id="app"> <v-app id="inspire"> <v-carousel> <v-carousel-item v-for="(color, i) in colors" :key="color"> <v-sheet :color="color" height="100%" tile> <v-layout align-center fill-height justify-center> <div>Slide {{ i + 1 }}</div> </v-layout> </v-sheet> </v-carousel-item> </v-carousel> </v-app> </div>
<div id="app"> <v-app id="inspire"> <v-container fluid> <v-layout row wrap> <v-flex md6 sm12> <div> <v-chip close>Example Chip</v-chip> </div> <div> <v-chip>Example Chip</v-chip> </div> </v-flex> <v-flex md6 sm12 xs12> <div> <v-chip close> <v-avatar> <img src="https://randomuser.me/api/portraits/men/35.jpg" alt="trevor"> </v-avatar> Trevor Hansen </v-chip> </div> <div> <v-chip> <v-avatar>A</v-avatar> ANZ Bank </v-chip> </div> </v-flex> </v-layout> </v-container> </v-app> </div>
<div id="app"> <v-app id="inspire"> <v-container fluid grid-list-md> <v-data-iterator :items="items" :rows-per-page-items="rowsPerPageItems" :pagination.sync="pagination" content-tag="v-layout" row wrap> <template v-slot:item="props"> <v-card> <v-card-title><h4>{{ props.item.name }}</h4></v-card-title> <v-divider></v-divider> <v-list dense> <v-list-tile> <v-list-tile-content>Calories:</v-list-tile-content> <v-list-tile-content>{{ props.item.calories }}</v-list-tile-content> </v-list-tile> <v-list-tile> <v-list-tile-content>Fat:</v-list-tile-content> <v-list-tile-content>{{ props.item.fat }}</v-list-tile-content> </v-list-tile> <v-list-tile> <v-list-tile-content>Carbs:</v-list-tile-content> <v-list-tile-content>{{ props.item.carbs }}</v-list-tile-content> </v-list-tile> <v-list-tile> <v-list-tile-content>Protein:</v-list-tile-content> <v-list-tile-content>{{ props.item.protein }}</v-list-tile-content> </v-list-tile> <v-list-tile> <v-list-tile-content>Sodium:</v-list-tile-content> <v-list-tile-content>{{ props.item.sodium }}</v-list-tile-content> </v-list-tile> <v-list-tile> <v-list-tile-content>Calcium:</v-list-tile-content> <v-list-tile-content>{{ props.item.calcium }}</v-list-tile-content> </v-list-tile> <v-list-tile> <v-list-tile-content>Iron:</v-list-tile-content> <v-list-tile-content>{{ props.item.iron }}</v-list-tile-content> </v-list-tile> </v-list> </v-card> </v-flex> </template> </v-data-iterator> </v-container> </v-app> </div>
new Vue({ el: '#app', data () { return { headers: [ { text: 'Dessert (100g serving)', align: 'left', sortable: false, value: 'name' }, { text: 'Calories', value: 'calories' }, { text: 'Fat (g)', value: 'fat' }, { text: 'Carbs (g)', value: 'carbs' }, { text: 'Protein (g)', value: 'protein' }, { text: 'Iron (%)', value: 'iron' } ], desserts: [ { name: 'Ice cream sandwich', calories: 237, fat: 9.0, carbs: 37, protein: 4.3, iron: '1%' } ] } } })
<div id="app"> <v-app id="inspire"> <v-data-table :headers="headers" :items="desserts"> <template v-slot:items="props"> <td>{{ props.item.name }}</td> <td>{{ props.item.calories }}</td> <td>{{ props.item.fat }}</td> <td>{{ props.item.carbs }}</td> <td>{{ props.item.protein }}</td> <td>{{ props.item.iron }}</td> </template> </v-data-table> </v-app> </div>
new Vue({ el: '#app', data () { return { headers: [ { text: 'Dessert (100g serving)', align: 'left', sortable: false, value: 'name' }, { text: 'Calories', value: 'calories' }, { text: 'Fat (g)', value: 'fat' }, { text: 'Carbs (g)', value: 'carbs' }, { text: 'Protein (g)', value: 'protein' }, { text: 'Iron (%)', value: 'iron' } ], desserts: [ { name: 'Frozen Yogurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0, iron: '1%' }, { name: 'Ice cream sandwich', calories: 237, fat: 9.0, carbs: 37, protein: 4.3, iron: '1%' }, { name: 'Eclair', calories: 262, fat: 16.0, carbs: 23, protein: 6.0, iron: '7%' }, { name: 'Cupcake', calories: 305, fat: 3.7, carbs: 67, protein: 4.3, iron: '8%' }, { name: 'Gingerbread', calories: 356, fat: 16.0, carbs: 49, protein: 3.9, iron: '16%' } ] } } })
<div id="app"> <v-app id="inspire"> <div> <v-dialog v-model="dialog" width="500"> <template v-slot:activator="{ on }"> <v-btn color="red lighten-2" dark v-on="on"> Click Me </v-btn> </template> <v-card> <v-card-title primary-title> Privacy Policy </v-card-title> <v-card-text> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </v-card-text> <v-divider></v-divider> <v-card-actions> <v-spacer></v-spacer> <v-btn color="primary" flat @click="dialog = false"> I accept </v-btn> </v-card-actions> </v-card> </v-dialog> </div> </v-app> </div>
<div id="app"> <v-app id="inspire"> <v-expansion-panel> <v-expansion-panel-content v-for="(item,i) in 5" :key="i"> <template v-slot:header> <div>Item</div> </template> <v-card> <v-card-text>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</v-card-text> </v-card> </v-expansion-panel-content> </v-expansion-panel> </v-app> </div>
public string TestNoneAsync() { var webClient = new WebClient(); return webClient.DownloadString("http://www.google.com"); }
public void TestAsync() { var webClient = new WebClient(); webClient.DownloadStringAsync(new Uri("http://www.google.com")); webClient.DownloadStringCompleted += webClientDownloadStringCompleted; } void webClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // use e.Result }
using System; using System.Linq; using System.Net; using System.Windows.Forms; namespace Async02 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnGetInfo_Click(object sender, EventArgs e) { var req = (HttpWebRequest)WebRequest.Create("http://www.google.com"); req.Method = "HEAD"; req.BeginGetResponse( asyncResult => { var resp = (HttpWebResponse)req.EndGetResponse(asyncResult); var headersText = formatHeaders(resp.Headers); txtResults.Text = headersText; }, null); } private string formatHeaders(WebHeaderCollection headers) { var headerString = headers.Keys.Cast<string>() .Select(header => string.Format("{0}:{1}", header, headers[header])); return string.Join(Environment.NewLine, headerString.ToArray()); } } }
An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code Additional information: Cross-thread operation not valid: Control 'txtResults' accessed from a thread other than the thread it was created on.
private void btnGetInfo_Click(object sender, EventArgs e) { var sync = SynchronizationContext.Current; var req = (HttpWebRequest)WebRequest.Create("http://www.google.com"); req.Method = "HEAD"; req.BeginGetResponse( asyncResult => { var resp = (HttpWebResponse)req.EndGetResponse(asyncResult); var headersText = formatHeaders(resp.Headers); sync.Post(delegate { txtResults.Text = headersText; }, null); }, null); }
using System; using System.Threading.Tasks; namespace Async01 { public class AsyncExample { public async Task DoWorkAsync(int parameter) { await Task.Delay(parameter); Console.WriteLine(parameter); } } }
public async Task<double> GetNumberAsync() { var generator = new Random(); await Task.Delay(generator.Next(1000)); return generator.NextDouble(); }
public async Task<double> GetSumAsync() { var leftOperand = await GetNumberAsync(); var rightOperand = await GetNumberAsync(); return leftOperand + rightOperand; }
public async Task<double> GetProductOfSumAsync() { var leftOperand = GetSumAsync(); var rightOperand = GetSumAsync(); return await leftOperand * await rightOperand; }
Operator '*' cannot be applied to operands of type 'System.Threading.Tasks.Task<double>' and 'System.Threading.Tasks.Task<double>'
public async Task<string> DownloadAsync() { var webClient = new WebClient(); return await webClient.DownloadStringTaskAsync("http://www.google.com"); }
public void TestDownloadAsync() { Debug.WriteLine("Before DownloadAsync"); DownloadAsync(); Debug.WriteLine("After DownloadAsync"); }
Before DownloadAsync After DownloadAsync
PM> Install-Package Microsoft.Bcl.Async
namespace SplittingTableSample.DomainClasses { public class Post { public virtual int Id { get; set; } public virtual string Title { get; set; } public virtual DateTime CreatedDate { get; set; } public virtual string Body { get; set; } public virtual byte[] Image { get; set; } } }
using (var context = new MyDbContext()) { var post = context.Posts.Find(1); }
exec sp_executesql N'SELECT TOP (2) [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title], [Extent1].[CreatedDate] AS [CreatedDate], [Extent1].[Body] AS [Body], [Extent1].[Image] AS [Image] FROM [dbo].[Posts] AS [Extent1] WHERE [Extent1].[Id] = @p0',N'@p0 int',@p0=1
namespace SplittingTableSample.DomainClasses { public class Post { public virtual int Id { get; set; } public virtual string Title { get; set; } public virtual DateTime CreatedDate { get; set; } public virtual PostMetaData PostMetaData { get; set; } } } namespace SplittingTableSample.DomainClasses { public class PostMetaData { public virtual int PostId { get; set; } public virtual string Body { get; set; } public virtual byte[] Image { get; set; } public virtual Post Post { get; set; } } }
namespace SplittingTableSample.DomainClasses { public class PostMetaDataConfig : EntityTypeConfiguration<PostMetaData> { public PostMetaDataConfig() { HasKey(x => x.PostId); HasRequired(x => x.Post).WithRequiredDependent(x => x.PostMetaData); } } }
var post = context.Posts.Find(1);
exec sp_executesql N'SELECT TOP (2) [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title], [Extent1].[CreatedDate] AS [CreatedDate] FROM [dbo].[Posts] AS [Extent1] WHERE [Extent1].[Id] = @p0',N'@p0 int',@p0=1
namespace SplittingTableSample.DomainClasses { public class PostConfig : EntityTypeConfiguration<Post> { public PostConfig() { ToTable("Posts"); } } } namespace SplittingTableSample.DomainClasses { public class PostMetaDataConfig : EntityTypeConfiguration<PostMetaData> { public PostMetaDataConfig() { ToTable("Posts"); HasKey(x => x.PostId); HasRequired(x => x.Post).WithRequiredDependent(x => x.PostMetaData); } } }
اگر دستورات زیر را اجرا کنید:
var post = context.Posts.Find(1); Console.WriteLine(post.PostMetaData.Body);
exec sp_executesql N'SELECT TOP (2) [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title], [Extent1].[CreatedDate] AS [CreatedDate] FROM [dbo].[Posts] AS [Extent1] WHERE [Extent1].[Id] = @p0',N'@p0 int',@p0=1
exec sp_executesql N'SELECT [Extent1].[Id] AS [Id], [Extent1].[Body] AS [Body], [Extent1].[Image] AS [Image] FROM [dbo].[Posts] AS [Extent1] WHERE [Extent1].[Id] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
var post = context.Posts.Include(x => x.PostMetaData).SingleOrDefault(x => x.Id == 1);
SELECT [Limit1].[Id] AS [Id], [Limit1].[Title] AS [Title], [Limit1].[CreatedDate] AS [CreatedDate], [Extent2].[Id] AS [Id1], [Extent2].[Body] AS [Body], [Extent2].[Image] AS [Image] FROM (SELECT TOP (2) [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title], [Extent1].[CreatedDate] AS [CreatedDate] FROM [dbo].[Posts] AS [Extent1] WHERE 1 = [Extent1].[Id] ) AS [Limit1] LEFT OUTER JOIN [dbo].[Posts] AS [Extent2] ON [Limit1].[Id] = [Extent2].[Id]
واقعیت این هست که برای چنین برنامهی کوچکی، 15مگابایت حجم زیادی به حساب میآید. بیشتر این حجم به دلیل کتابخانهی کلاسهای پایه (BCL) میباشد که شامل mscorlib.lib، system و Mono.Android هستند. این کلاسها کامپوننتهایی را که برنامهی ما برای اجرا به آنها احتیاج دارند، فراهم میکنند. البته واقعیت این است که برنامهی ما از تمام این امکانات استفاده نمیکند و میتوان از خیلی از آنها صرف نظر کرد.
وقتی شما برنامهای را برای توزیع آماده میکنید، Xamarin پروسهای را که به Linking معروف است، اجرا میکند. در این پروسه کدهایی که استفاده نشدهاند حذف میشوند. به این ترتیب حجم کدهای برنامه را کاهش میدهند. در واقع بخشهایی از BCL را که استفاده نکردهایم از Package نهایی حذف میکند. برای مثال پروژهی "Hello Word"را در نظر بگیرید (پروژهی پیش فرض). به دلیل آنکه ما از کلاسهای خاصی استفاده نکردهایم، مقدار زیادی از کدهای بلااستفادهی BCL حذف میشوند. تصویر زیر حجم برنامه را مشخص میکند:
چه زمانی از Xamarin.Forms استفاده کنیم:
یکی از راههای ایجاد برنامههای بومی برای اندروید و iOS، استفاده از Xamarn.Android و Xamarin.iOS است. راه دیگر آن Xamarin.Forms است که بیشترین قابلیت اشتراک UI را دارا میباشد. در Xamarin.Forms ما میتوانیم از XAML برای ایجاد UI استفاده کنیم. اما کی بهتر است از آن استفاده کنیم و چه وقت خوب نیست؟
مواردی که بهتر است از Xamarin.Forms استفاده کنیم:
مواردی که بهتر است از Xamarin.Forms استفاده نکنیم: