انتشار PostSharp 4.1 RTM
ILSpy 2.3 منتشر شد
پروژه DartVS
ویژگیهای مورد بحث شامل موارد زیر میباشند:
• ویرایش TextBoxها در محیط Designer
• Copy و Paste کردن Styleها از یک کنترل به کنترل دیگر
• قالب بندی شرطی
• پیمایش و تغییر اندازه گزارش و آیتمهای آن
• تغییر اندازه بخشهای مختلف گزارش نظیر Page Header ، Detail و ...
• افزودن TextBox Shape و PictureBox درون Designer گزارش
• استفاده از پنجره Data Explorer
• استفاده از پنجره Report Explorer
در ادامه به بررسی موارد ذکر شده جهت طراحی گزارش میپردازیم.
1. جهت تغییر محتوای یک TextBox میتوان روی آن دوبار کلیک نمود. پس از آن TextBox به حالت ویرایش میرود و میتوان متن درون آن را به سادگی تغییر داد.این کار در محیط Designer انجام میشود و نیازی نیست برای تغییر محتوای TextBox به پنجره Properties بروید و متن آن را تغییر دهید.
2. در محیط Designer به راحتی میتوانید گزارش خود را Zoom نمایید.این کار توسط ComboBox مربوطه در پایین سمت چپ Designer انجام میشود.
3. اگر قرار باشد TextBox جدیدی به گزارش خود اضافه نمایید، کافی است آن را از بخش ToolBox به محیط گزارش بکشید و سپس به چینش آن بپردازید.
4. در محیط طراح گزارش Telerik میتوانید به راحتی یک قالب بندی و یا Style را از کنترلی به کنترل دیگر کپی نمایید و در وقت خود جهت طراحی گزارش صرفه جویی نمایید. برای انجام اینکار کافی است روی کنترلی که قرار است Style آن را کپی نمایید راست کلیک نموده و پس از آن از منوی ظاهر شده گزینه Copy Style را انتخاب نمایید. در ادامه میتوانید کنترل و یا کنترل هایی که قرار است قالب بندی را به آنها اعمال کنید انتخاب نموده ، روی آنها راست کلیک نمایید و گزینه Paste Style را انتخاب کنید.با این کار Style ی که در مرحله قبل از کنترلی دیگر کپی کرده بودید به کنترل یا کنترلهای انتخاب شده اعمال میشود.
5. یکی دیگر از امکانات Telerik Reporting امکان قالب بندی شرطی (Conditional Formating) میباشد. یعنی Style یک کنترل توسط شرطها تعیین میشود. برای مثال میتوانیم بگوییم که اگر مقدار فروش بیشتر از مبلغ خاصی بود ، عدد نمایش داده شده با رنگ سبز نمایش داده شود و یا اینکه از فونت و یا اندازه دیگری جهت نمایش آن استفاده شود (به طور کلی با توجه به شرطهای تعیین شده نمایش آن کنترل با یک Style متفاوت صورت گیرد). در قسمتهای آینده به بررسی کامل این قابلیت نیز خواهیم پرداخت.
6. یکی از امکاناتی که در هنگام طراحی گزارش در اختیار ما قرار میگیرد پنجره Data Explorer میباشد. توسط این پنجره میتوان فیلدهای یک منبع داده (DataSource) را مشاهده نمود و برای اینکه بتوان از آنها در محیط طراحی استفاده کرد بر روی محیط طراحی درگ نمود. DataSourceها انواع مختلفی دارند که در قسمت اول این آموزش به معرفی آنها پرداختیم و از نمونه Sql آن نیز جهت طراحی یک گزارش ساده استفاده کردیم. در ادامه نیز با این موارد بیشتر آشنا خواهید شد.در تصویر زیر نحوهی درگ کردن یک فیلد تصویر را از پنجره Data Explorer مشاهده مینمایید.
7.
یکی دیگر از اجزای Reporting پنجرهی Report Explorer میباشد. توسط این
پنجره میتوان دسترسی سریعی به اجزای درون گزارش داشت. برای مثال میتوان
به راحتی یک بخش درون گزارش را انتخاب نمود و در پنجرهی Properties
تغییراتی در آن اعمال نمود.
ادامه دارد ...
Could not load type 'System.Windows.Forms.Form' from assembly 'System.Windows.Forms, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC'. System.Windows.Forms 3.5.7283.0 but 3.5.0.0 windows CE
برای انجام این فرآیند احتیاج به نصب مقدماتی بر روی یک ویندوز تازه است که ترتیب نصب آن نیز بسیار مهم است:
1. Microsoft Visual Studio 2005 2. Microsoft Visual Studio 2005 Service Pack 1 3. Microsoft Windows Embedded CE 6.0 Toolkit 4. Windows Embedded CE 6.0 Platform Builder Service Pack 1 5. Windows Embedded CE 6.0 R2 6. Windows Embedded CE 6.0 R3
- Hello World براساس سن و شغل! | پویا | zombie-geek.net
- بهبود رتبه سایت - جدول تناوبی سئو | (مجتبی بنائی) | www.banaie.ir
- راهنمای تنظیم فایرفاکس ۷ برای نشان دادن http:// در آدرس صفحات | مدیریت مجله نودایران | nodiran.com
- مدیر پروژه باید منبع آرامش باشد، مثل خولیو بلاسکو | مهدی عرب عامری | pmplus.ir
- Babel Obfuscator 4.3.0.0 منتشر شد | babelobfuscator.blogspot.com
- Lambdas در C++11 | geekswithblogs.net
- Visual Studio 2010 Feature Pack 2 منتشر شد | geekswithblogs.net
- Windows Phone SDK 7.1 منتشر شد | windowsteamblog.com
- Windows Simulator جهت توسعه برنامههای مخصوص ویندوز 8 | blogs.msdn.com
- Windows Simulator و دیباگ برنامههای لمسی | blogs.msdn.com
- به روز رسانی اول RAD Studio XE2 و یک سری مشکلات کپی رایت | www.itwriting.com
- پشتیبانی از ایجاد سایههای متنی در IE10 | blogs.msdn.com
- توابع جدید کار با رشتهها در نسخهی بعدی SQL Server | beyondrelational.com
- خلاصهای از مواردی که در نگارش بعدی سی شارپ شاهد خواهیم بود | weblogs.thinktecture.com
- مروری بر قابلیت آنالیز کدهای سی++ در نگارش بعدی ویژوال استودیو | channel9.msdn.com
یک مثال جهت بازتولید کدهای این مطلب
الف) یک پروژهی WPF جدید را به نام MergeAssembliesIntoWPF ایجاد کنید.
ب) یک پروژهی Class library جدید را به نام MergeAssembliesIntoWPF.ViewModels به این Solution اضافه کنید. از آن برای تعریف ViewModelهای برنامه استفاده خواهیم کرد.
برای نمونه کلاس ذیل را به آن اضافه کنید:
namespace MergeAssembliesIntoWPF.ViewModels { public class ViewModel1 { public string Data { set; get; } public ViewModel1() { Data = "Test"; } } }
به این پروژه ارجاعی را به اسمبلی قسمت (ب) اضافه نموده و برای نمونه User control ذیل را به نام View1.xaml به آن اضافه نمائید:
<UserControl x:Class="MergeAssembliesIntoWPF.Shell.View1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" xmlns:VM="clr-namespace:MergeAssembliesIntoWPF.ViewModels;assembly=MergeAssembliesIntoWPF.ViewModels" d:DesignHeight="300" d:DesignWidth="300"> <UserControl.Resources> <VM:ViewModel1 x:Key="ViewModel1" /> </UserControl.Resources> <Grid DataContext="{Binding Source={StaticResource ViewModel1}}"> <TextBlock Text="{Binding Data}" /> </Grid> </UserControl>
<Window x:Class="MergeAssembliesIntoWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:V="clr-namespace:MergeAssembliesIntoWPF.Shell;assembly=MergeAssembliesIntoWPF.Shell" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <V:View1 x:Key="View1" /> </Window.Resources> <Grid> <V:View1 /> </Grid> </Window>
ب) مدفون کردن خودکار اسمبلیهای جانبی برنامه در فایل EXE آن
فایل csproj پروژه اصلی را خارج از VS.NET باز کنید. در انتهای آن سطر ذیل قابل مشاهده است:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterResolveReferences"> <ItemGroup> <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'"> <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName> </EmbeddedResource> </ItemGroup> </Target>
پس از این تغییر نیاز است یکبار پروژه را بسته و مجددا باز کنید. اکنون پروژه را build کنید و جهت اطمینان بیشتر آنرا برای مثال توسط ILSpy مورد بررسی قرار دهید:
همانطور که مشاهده میکنید، دو اسمبلی مورد استفاده در برنامه به صورت خودکار در قسمت منابع فایل EXE مدفون شدهاند.
اگر به مسیر LogicalName تنظیمات فوق دقت کنید، DestinationSubDirectory نیز ذکر شدهاست. علت این است که بسیاری از اسمبلیهای بومی سازی شده WPF با نامهایی یکسان اما در پوشههایی مانند fa، fr و امثال آن ذخیره میشوند. به همین جهت نیاز است بین اینها تمایز قائل شد.
ج) بارگذاری خودکار اسمبلیها در AppDomain برنامه
تا اینجا اسمبلیهای جانبی را در فایل EXE مدفون کردهایم. اکنون نوبت به بارگذاری آنها در AppDomain برنامه است. برای اینکار نیاز است تا روال رخدادگردان AppDomain.CurrentDomain.AssemblyResolve را تحت نظر قرار داده و اسمبلیهایی را که برنامه درخواست میکند، در همینجا از منابع خوانده و به AppDomain اضافه کرد.
انجام اینکار در برنامههای WinForms سادهاست. فقط کافی است به متد Program.Main برنامه مراجعه کرده و تعریف یاد شده را به ابتدای متد Main اضافه کرد. اما در WPF هرچند فایل App.xaml.cs به نظر نقطهی آغازین برنامه است، اما در واقع اینطور نیست. برای نمونه، پوشهی obj\Debug برنامه را گشوده و فایل App.g.i.cs آنرا بررسی کنید. در اینجا میتوانید همان رویه شبیه به برنامههای WinForm را در متد Program.Main آن، مشاهده کنید. بنابراین نیاز است کنترل این مساله را راسا در دست بگیریم:
using System; using System.Globalization; using System.Reflection; namespace MergeAssembliesIntoWPF { public class Program { [STAThreadAttribute] public static void Main() { AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly; App.Main(); } private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args) { var executingAssembly = Assembly.GetExecutingAssembly(); var assemblyName = new AssemblyName(args.Name); var path = assemblyName.Name + ".dll"; if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false) { path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path); } using (var stream = executingAssembly.GetManifestResourceStream(path)) { if (stream == null) return null; var assemblyRawBytes = new byte[stream.Length]; stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length); return Assembly.Load(assemblyRawBytes); } } } }
پس از اینکه کلاس فوق را اضافه کردید، نیاز است کلاس Program اضافه شده را به عنوان Startup object برنامه نیز معرفی کنید:
انجام اینکار ضروری است؛ در غیراینصورت با متد Main موجود در فایل App.g.i.cs تداخل میکند.
اکنون برای آزمایش برنامه، یکبار آنرا Build کرده و بجز فایل Exe، مابقی فایلهای موجود در پوشهی bin را حذف کنید. سپس برنامه را خارج از VS.NET اجرا کنید. کار میکند!
MergeAssembliesIntoWPF.zip