پردازش متن (Text Rendering)

همانطور که تا کنون نیز مشاهده کردید، WPF تفاوت‌های زیادی با WindowsForm در طراحی ظاهر برنامه دارد. ظاهری که در ویندوز فرم برای برنامه خود ایجاد می‌کنید وابستگی زیادی به API های ویندوز دارد. برای مثال در ویندوز فرم برای نمایش یک متن از GDI (Graphics Device Interface) ویندوز استفاده می‌شود در حالی که WPF پیاده سازی اختصاصی خودش را دارد تا به این وسیله در سیستم‌های مختلف نمایش یکسان و مناسبی را ارائه دهد.
متاسفانه این پیاده سازی اختصاصی منجر به ایجاد مشکلاتی در نمایش متن‌ها به خصوص در فونت‌های ریز شده بود و نوشته‌ها کمی مات نمایش داده می‌شد اما مایکروسافت در.NET framework نسخه 4.0 تغییرات اساسی را بر روی آن اعمال کرد. بنابراین اگر از نسخه 4.0 به بالا استفاده کنید مشکلی در این زمینه نخواهید داشت.

کنترل Text Rendering

در.NET framework نسخه 4.0، مایکروسافت تصمیم گرفت تا اختیارات بیشتری را برای نحوه نمایش متن‌ها در اختیار برنامه نویسان قرار دهد. برای این منظور کلاس TextOptions را با خاصیت‌های TextFormattingMode و TextRenderingMode به WPF اضافه کرد که به شما اجازه می‌دهد تا در مورد نحوه فرمت بندی و نمایش متن‌ها را در برنامه تصمیم گیری کنید. در ادامه می‌خواهیم این ویژگی‌ها را مورد بررسی قرار دهیم.

TextFormattingMode

این Property به شما اجازه می‌دهد تا الگوریتم فرمت بندی متن را تعیین کنید. شما می‌توانید دو مقدار Ideal و Display را برای این Property در نظر بگیرید. در صورتی که مقداری را برای آن تعیین نکنید به صورت پیش فرض مقدار آن را Ideal در نظر می‌گیرد. در بیشتر مواقع Ideal مورد استفاده قرار می‌گیرد ولی در صورتی که می‌خواهید متن‌های بسیار ریز را نمایش دهید Display معمولاً نتیجه بهتری را ارائه می‌دهد. برای درک تفاوت بین این دو به مثال زیر توجه کنید:

<StackPanel Margin="10">
    <Label TextOptions.TextFormattingMode="Ideal" FontSize="9">
        TextFormattingMode.Ideal, small text
    </Label>
    <Label TextOptions.TextFormattingMode="Display" FontSize="9">
        TextFormattingMode.Display, small text
    </Label>
    <Label TextOptions.TextFormattingMode="Ideal" FontSize="30">
        TextFormattingMode.Ideal, large text
    </Label>
    <Label TextOptions.TextFormattingMode="Display" FontSize="30">
        TextFormattingMode.Display, large text
    </Label>
</StackPanel>

زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

برای اینکه تفاوت را مشاهده کنید، باید مقدار FontSize را کم و زیاد، برنامه را اجرا و تست کنید.

TextRenderingMode

این Property به شما اجازه می‌دهد تا الگوریتم Anti Aliasing را برای نمایش متن تعیین کنید. در گرافیک کامپیوتری به تکنیکی که با صاف کردن لبه‌های دندانه دار در خطوط و منحنی‌ها باعث بهبود کیفیت تصویر می‌شود Anti Aliasing گفته می‌شود. برای درک بهتر به تصویر زیر توجه کنید:

ترکیب این ویژگی با Display که در TextFormattingMode آن را بررسی کردیم، می‌تواند تأثیر زیادی در نمایش متن نهایی داشته باشد. برای درک این تفاوت‌ها به مثل زیر توجه کنید:

<StackPanel Margin="10" TextOptions.TextFormattingMode="Display">
        
    <Label TextOptions.TextRenderingMode="Auto" FontSize="9">
        TextRenderingMode.Auto, small text
    </Label>
    <Label TextOptions.TextRenderingMode="Aliased" FontSize="9">
        TextRenderingMode.Aliased, small text
    </Label>
    <Label TextOptions.TextRenderingMode="ClearType" FontSize="9">
        TextRenderingMode.ClearType, small text
    </Label>
    <Label TextOptions.TextRenderingMode="Grayscale" FontSize="9">
        TextRenderingMode.Grayscale, small text
    </Label>
    <Label TextOptions.TextRenderingMode="Auto" FontSize="18">
        TextRenderingMode.Auto, large text
    </Label>
    <Label TextOptions.TextRenderingMode="Aliased" FontSize="18">
        TextRenderingMode.Aliased, large text
    </Label>
    <Label TextOptions.TextRenderingMode="ClearType" FontSize="18">
        TextRenderingMode.ClearType, large text
    </Label>
    <Label TextOptions.TextRenderingMode="Grayscale" FontSize="18">
        TextRenderingMode.Grayscale, large text
    </Label>
        
</StackPanel>

زمانی که این برنامه را اجرا کنیم خروجی زیر را نشان می‌دهد:

شاید این ریزه کاری ها به ظاهر بی اهمیت باشد اما رعایت این نکات در برنامه‌هایی که کیفیت آن‌ها برای شما اهمیت دارد می‌تواند مفید باشد.