حل مشکل Intellisense با ریسورس دیکشنری های تو در تو

ویژوال استودیو با اینکه بهترین IDE شناخته شده دنیا هستش اما گاهی اوقات باگ های قدیمی و خنده داری هم دارد که اصلا در شان آن با این همه امکانات و قدرت نیست!

بعد از نسخه 3.5 دات نت فریمورک (که اولین نسخه xaml و wpf در دات نت 3.5 معرفی شد) ماکروسافت اقدام به ارتقا زبان xaml و پلتفرم wpf گرفت. که این تغییرات در دات نت 4 اعمال شدند. اما با این تغییرات اگر شما تعداد زیادی فایل ResourceDictionary داشتید و هر کدام از این فایل هارا بصورت جداگانه در ResourceDictionary دیگری فراخوانی میکردید (فرض کنید یک فایل شامل رنگ ها، افکتها، کانورترها- یک فایل شامل استایل ها و...) در این صورت بدلیل ایجاد ساختار تودرتو و پیچیده دیگر ویژوال استودیو قادر به نمایش Resources ها در منوی Intellisense نبود. (هنوز هم نیست!)

این مشکل از ابتدا تا امروز بوده و توسط جامعه برنامه نویسی راه حل های مختلفی جهت حل این مشکل ارائه شده است اما هیچکدام راه حل قطعی نبوده و مشکلاتی را داراست.

اما نکته ای که جالب توجه است این است که هیچ کس تا به چند روز پیش این مشکل را بصورت درست به تیم توسعه ماکروسافت منعکس نکرده بود تا اینکه من خودم گزارش کردم و در نسخه اخیر 16.4 پیشنمایش 3 تا حدودی مشکل حل شد. اما همچنان ساختارهای تودر تو دارای مشکل می باشند که مجددا گزارش شد.

در ادامه به راه حل های موجود برای این مشکل میپردازم:

  1. استفاده از آخرین نسخه ویژوال استودیو نسخه 16.4 پیش نمایش 3 و نسخه های آتی.
  2. تمامی استایل‌ها و منابع خود را در یک فایل xaml قرار دهید و از ایجاد چندین فایل جدا، خودداری کنید. جهت جلوگیری از به‌هم ریختگی و سردرگمی، میتوانید از Region بندی کدها استفاده کنید.
  3. با استفاده از این روش میتوانید منابع را در حالت طراحی، شناسایی کنید. اما روش پایدار و قابل اطمینانی نیست.

- ابتدا در پروژه خود یک ResourceDictionary را ایجاد کنید و نام آن را DesignTimeResources.xaml قرار دهید.
- این فایل را به پوشه Properties پروژه منتقل کنید.
- پروژه را Unload کنید و سپس راست کلیک کرده و گزینه Edit CsProj را بزنید و کدهای زیر را جایگزین کدهای DesignTimeResources قبلی کنید.

<ItemGroup>
  <Page Include="Properties\DesignTimeResources.xaml">
    <SubType>Designer</SubType>
    <Generator>MSBuild:Compile</Generator>
    <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
  </Page>
</ItemGroup>

- پروژه را ذخیره کنید و دوباره Reload کنید.
- فایل دیکشنری  DesignTimeResources .xaml را باز کنید و محتوای آن را به این صورت تغییر دهید.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >  
   <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/MyAssembly;component/Presentation/Common/Resources/Main.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary>

دقت کنید که به جای خط زیر

<ResourceDictionary Source="/MyAssembly;component/Presentation/Common/Resources/Main.xaml"/>

باید آدرس منابع خود را وارد کنید.
حالا به‌راحتی میتوانید منابع را در کل پروژه شناسایی کنید.