سئوالات و مباحث WPF

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد ، visual studio 2022 v17.0.2 را دانلود کردم .
پروژه های wpf ام را باهاش اجرا کردم . زمان طراحی (design time) در بعضی از window ها ، ارورهایی میده . گاها اون window را زمان طراحی نشون نمیده .
اما زمان اجرای برنامه (در visual studio 2022) ، هیچ مشکلی نیست و به درستی اجرا میشن . پروژه های جدیدِ wpf ای که درست میکنم هم هیچ مشکلی ندارن .
پروژه های windows form هم (چه زمان طراحی یا اجرا) در visual studio 2022 ، هیچ مشکلی ندارن .
توی visual studio 2019 ، زمان طراحی در xaml هم هیچ مشکلی نبود و اروری نمیداد .

فرضا دو نمونه از ارورهای زمان طراحی در دو window ئه مختلف در دو پروژه ی مختلف را در تصواویر زیر میبینید :

1.JPG

و در پروژه ی دیگه :

2.JPG

توی توضیحات visual studio 2022 نوشته که زمان طراحی در xaml ، تفاوت هایی ایجاد شدش . و ممکنه کنترل هایی که شرکت های دیگه برای wpf طراحی کردن ، نیاز به طراحی مجدد برای زمان طراحی در xaml نیاز داشته باشه (چیزی که قبلا خوندم و یه چیزهایی یادمه ، مضمون کلی اش این بود) .


این ارورها ، از همین قضیه سرچشمه میگیره به نظرتون؟
تشکر استاد
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد .

XML:
            <UserControl:TitleBarUserControl.Resources>
                <Style TargetType="{x:Type CustomControls:ShapeTextButton}" BasedOn="{StaticResource {x:Type CustomControls:ShapeTextButton}}">
                    <Setter Property="DockPanel.Dock" Value="Right"/>
                    <Setter Property="Margin" Value="0,8,10,8"/>
                    <Setter Property="Width" Value="24"/>
                    <Setter Property="Height" Value="24"/>
                    <Setter Property="GetContentBrush_ForWhichButtonShapeProperty" Value="Stroke"/>
                </Style>
            </UserControl:TitleBarUserControl.Resources>

منظورم از استایل قبلی ، استایلِ ShapeTextButton ای هست که در DarkStyle یا LightStyle تعریف شده و کلید نداره (که اگه کلیدی نداشته باشه ، میدونید که اتوماتیک ، کلیدِ نوعِ همون المنت و همون نوع را در نظر میگیره) .


حالا مشکل اینه که هر کنترل ShapeTextButton ای که درون این TitleBarUserControl ایجاد میکنم (یعنی هر کنترل ShapeTextButton ای که استایل در کد بالا روش اِعمال میشه) ، استایلِ پیش فرض اش که هر چی باشه که این استایل پیش فرض را در Resource ئه App.Xaml اون استایل را لود کردم ، همون اِعمال میشه اما وقتی استایل در Resource ئه App.Xaml را تغییر میدم ، ShapeTextButton هایی که در TitleBarUserControl هستن ، استایلِ جدید ، روشون اِعمال نمیشه و همون استایل قدیم شون باقی میمونن .
اما ShapeTextButton هایی که استایل در کد بالا براشون اِعمال نمیشه (یعنی درون TitleBarUserControl نیستن) ، مشکلی ندارن و به درستی کار میکنن .


این مشکل ، بخاطر پروپرتیِ BasedOn در کد بالا که بصورت StaticResource استفاده میشه هست؟
چون این پروپرتی که DependencyProperty نیست و پس نمیشه بصورت DynamicResource ازش استفاده کرد .

سلامی مجدد استاد .
ان شاء الله سلامت باشید . :rose:

انگار این مشکل را متوجه شدم .
انگار ، مشکل برای همون پروپرتیِ BasedOn هست که چون از نوع DependencyProperty نیست ، پس فقط بصورت StaticResource میشه ازش استفاده کرد . StaticResource هم که با تغییر کردنِ Resource ، متوجه نمیشه و تغییر نمیکنه .
و باز هم چون از نوع DependencyProperty نیست ، Binding نمیشه براش انجام داد .

بنابراین زمانی که از پروپرتیِ BasedOn استفاده میکنیم (یعنی زمانی که از استایلِ دوم یا سوم یا الی آخر ، بر اساسِ استایل های قبلی یا استایل اولی استفاده میکنیم) ، با تغییرِ استایلِ اولی یا با تغییر استایل های قبلی ، استایلِ آخری (فرضا استایلِ دومی) متوجه نمیشه تا بر اساسِ استایل های قبلی اش تغییر کنه .

پس در صورتی که از چند استایل ها (توسط پروپرتیِ BasedOn) استفاده میکنیم ، اگه استایل های قبلی اش را تغییر دادیم (فرضا استایلِ اولی را تغییر دادیم) ، باید شیِ جدیدی از اون استایلِ آخری ای که توسط پروپرتیِ BasedOn ساخته بودیم ، ایجاد کنیم و مجددا سِت و تنظیم کنیم .

جالب اینجاست که در یه پنجره ی دیگه ، استایل دومِ ShapeTextButton را بر اساسِ استایلِ اولش (یعنی دقیقا شبیه کد بالا) را منتها برای کنترل های ShapeTextButton ای که درون یک Grid بودن ، یعنی برای Resource ئه Grid ساختمش و بدون مشکل کار میکنه . پروپرتیِ BasedOn اش را StaticResource کردم . و با تغییر LightStyle به DarkStyle و برعکس ، این ها هم تغییر میکنن و درست کار میکنن .

این پنجره ، همون پنجره ی SettingWindow بود .
اول ، در پنجره ی MainWindow ، استایل را (فرضا به LightStyle) تغییر میدادم و بعد واردِ پنجره ی SettingWindow میشدم . هر بار هم که واردِ پنجره ی SettingWindow میشدم ، شیِ جدیدی از این پنجره میساختم .
بنابراین دکمه ها و همچنین استایلِ جدیدی هم برای دکمه های ShapeTextButton ایجاد میشد . پس مشخص هست که نباید مشکلی وجود میداشت (چون استایلِ جدیدی براش در نظر گرفته میشد) .

اما وقتی درونِ همون پنجره ی SettingWindow ، استایل را (فرضا به LightStyle) تغییر میدادم ، چون در پروپرتیِ BasedOn ئه شیِ استایلِ دومی ، بصورت StaticResource استفاده میشد ، همین مشکل وجود داشت .

مشکل دیگه اینکه وقتی این کد استایلِ ShapeTextButton را درونِ خودِ فایل xaml در کلاس TitleBarUserControl مینویسم (دقت کنید که این بار ، منظورم شی ای از کلاس TitleBarUserControl که فرضا در MainWindow و ... ازش میسازیم ، نیست . بلکه درون یکی از المنت Panel ای که در فایل xaml ئه کلاس TitleBarUserControl استفاده میکنیم ، هست) ، اولا اینکه مشکلی که در بالا گفته بودم ، همچنان پابرجاست و علاوه بر اون ، هر چند زمان اجرا ، درست اجرا میشه اما زمان طراحی ، ارور میده که نمیتونه resource ای با نام ShapeTextButton را پیدا کنه . در صورتی که نام فضای نام و کلا چیزهایی که مربوط به ShapeTextButton هست را درست میدم و برنامه به درستی اجرا میشه .

بعدش هم TitleBarUserControl ام هم به طَبَعِ این ارور ، زمان طراحی ، خطا میده و نشون داده نمیشه (اما زمان اجرای برنامه مشکلی نداره) .
اما اگه قبل از اجرای این استایلِ ShapeTextButton ای که در المنت Panel ئه TitleBarUserControl نوشته بودم ، استایل DarkStyle یا LightStyle را درون TitleBarUserControl الحاق کنم ، این مشکل حل میشه (با وجود اینکه DarkStyle را در فایل App.xaml الحاق کردم) :

XML:
<local:PoshtibangirToloUserControlBase.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/PoshtibangirTolo;component/Resource/Style_Template/DarkStyleResource.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </local:PoshtibangirToloUserControlBase.Resources>

میدونین چرا استایل ShapeTextButton که در کد اول در این پست دادم را در المنت Panel ئه TitleBarUserControl به تنهایی مینویسم ، همچین مشکلی ایجاد میشه؟

تشکر استاد .

جواب این رو هنوز نمیدونم .

اما هنوز این سئوال باقی میمونه که پس چرا دقیقا همین قضیه که برای استایل ShapeTextButton که در پنجره ی SettingWindow هم انجام دادم و اونجا با همون کدهای xaml به درستی کار میکنه (و فرضا مثل این نیاز نیست که استایل جدیدی زمان تغییر استایل در App.Current.Resources براش در نظر بگیریم) که ماجراش را در پست قبلی گفتم .

و هنوز این سئوال مطرح هست که مشکل اصلی کجاست که با کد بالا و شیِ جدید دادن به Resource و Style ئه مورد نظر ، مشکل حل میشه و آیا نمیشه کاری کرد که مثل دکمه های ShapeTextButton ای که در SettingWindow وجود دارن ، با کدهای xaml درست بشه و نیاز به شیِ جدید دادن به Resource و Style زمان اجرا و در کدهای سی شارپ نداشته باشه؟

تشکر استاد .

سلامی مجدد
استاد ، من این قضیه ای که در بالا گفتم (مشکل تغییر استایل زمانی که از BasedOn استفاده میکنیم) را در یه پروژه ی خیلی کوچیک تر هم تست کردم ، همین مشکل وجود داشت . (اون موقع میگفتین که مشکلات را در مقیاس و در پروژه های کوچیک تر تست کنیم) .

حتی این مشکل برای کنترل های دیگه هم مثل کمبوباکس وجود داشت .
نمیدونم همین قضیه (قضیه ی استفاده از BasedOn در استایل ها) را چرا زمانی که در صفحه ی تنظیمات (در پروژه پشتیبانگیر طلوع) استفاده میکنم ، به درستی کار میکنه اما در صفحات دیگه مثل صفحه ی اصلی (Main Window) استفاده میکنم ، این مشکل را داره که با تغییر استایل (مثلا به Light Style) ، اون کنترل هایی که از استایل دوم و از طریق پروپرتیِ BasedOn تنظیم شدن ، روی همون استایلِ قبلی شون میمونن .

این پروژه ی کوچیک را بازگذاری میکنم اینجا (دکمه ی ضربدر یا close کلیک شه ، باعث تغییر استایل میشه اما استایل هایی که براشون از BasedOn استفاده شده ، تغییر نمیکنن) .
من هنوز متوجه نشدم مشکل از کجاست .

در بالا جواب داده شد .

یه سئوال استاد .
مگه هر جا از StaticResource استفاده بشه ، فقط یک بار از اون منبع استفاده نمیشه؟

بله .

یعنی فقط یک بار از اون منبع استفاده میشه و با تغییر منبع ، اون پروپرتی ای که از StaticResource استفاده کرد ، نباید تغییر کنه دیگه . درسته؟

بله .

بعد هم زمانی که استایلی را مینویسیم و کلیدی را براش در نظر نمیگیریم ، کلید پیش فرضش همون نوعِ خودش میشه دیگه .
فرضا استایلی برای Button مینویسیم و کلیدی را براش در نظر نمیگیریم ، کلیدش ، شی ای از نوعِ Type ئه Button میشه دیگه .
درسته؟

بله .

در این زمان ، پروپرتیِ Style برای تمامِ دکمه ها ، با اونکه ما ننویسیم شون ، بصورت کد زیر میشه دیگه :

XML:
Style="{StaticResource {x:Type Button}}"

درسته؟

نه .
بصورت DynamicResource میشه (تست که کردم) :

XML:
Style="{DynamicResource {x:Type Button}}"

خیلی ممنون استاد .
ان شاء الله سلامت باشید .
:rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد .
ان شاء الله سلامت باشید .

یک چیز دیگه که خواستم برای بعدا (برای مرور) بگم اینکه متد InvalidateProperty ، یه پروپرتی (DependencyProperty) را نامعتبر (به قولی آپدیت و ریفرش) میکنه .

نمیدونم چرا Style ئه شیِ ToolTip ئه TaskBarIcon ، بعد از تغییر استایل به LightStyle (و در نتیجه تغییرِ استایلِ ToolTip به استایلِ روشن) ، همون استایل قبلی اش بود و استایل جدید را در ظاهرش نشون نمیداد تا اینکه این مت را برای شیِ ToolTip اش فراخوانی کردم و درست شد .
نمیدونم چرا بقیه ی کنترل ها با تغییر استایل ، نیاز به فراخونی این متد نداشتن و درست کار میکردن اما پروپرتیِ Style ئه این کنترل ، نیاز داشت .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد .
نمیدونم چرا توی Visual Studio 2022 ، استایل ای که Window میدم ، در زمان طراحی کار نمیکنه اما توی نسخه ی 2019 اش هیچ مشکلی نبود . (زمان اجرا ، مشکلی نداره) (همچنین استایل بقیه ی کنترل ها هم مشکلی نداره) .
که در پست 901 ، گفته بودم .

راه حلش اینه که از پروپرتیِ d:DesignerProperties.DesignStyle (که اسنادش نوشته نشده) ، استفاده کنیم :

XML:
    <d:DesignerProperties.DesignStyle>
        <Style TargetType="{x:Type Window}">
            <Setter Property="Background" Value="Red"/>
        </Style>
    </d:DesignerProperties.DesignStyle>

با این کار ، استایلِ اون کنترل (در اینجا استایل کنترل Window) ، در زمان طراحی ، همونی میشه که در استایل بالا تعریف میکنیم .
تشکر استاد .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد
این پست را برای مرور در آینده میگم .
اینکه در ویژال استودیو میتونیم سربرگ ها(ی پروژه هایی که باز میکنیم) را در دو لایه ی مجزا ایجاد کنیم .
راه حلش اینه که در Option>Environment>Tab & Windows بریم در قسمت Pinned Tabs ، گزینه ی "show pinned tabs in separate row" را تیک بزنیم :


1.png


و بعد اون سربرگ های پروژه هایی که باز میکنیم را Pin کنیم (با کلیک روی این آیکون یا کلیک راست و انتخاب گزینه ی "Pin Tab" روی سربرگ مورد نظر) تا اون سربرگ در ردیف مجزایی در ردیف بالا نمایش داده بشه .
تشکر .
 

the_king

مدیرکل انجمن
بعد استاد یه مسئله ای برای ShapeTextButton ام هست .
ساختار استایل هام را میدونید که ، یه DarkStyle و یه LightStyle دارم که شامل استایل های نوع ShapeTextButton هم هستن .
بعد در TitleBarUserControl (که از نوع UserControl هست) ، از ShapeTextButton استفاده کردم منتها در Resource ئه TitleBarUserControl ، یک استایلِ دیگه از ShapeTextButton ساختم که بر اساسِ استایلِ قبلی هست :

XML:
            <UserControl:TitleBarUserControl.Resources>
                <Style TargetType="{x:Type CustomControls:ShapeTextButton}" BasedOn="{StaticResource {x:Type CustomControls:ShapeTextButton}}">
                    <Setter Property="DockPanel.Dock" Value="Right"/>
                    <Setter Property="Margin" Value="0,8,10,8"/>
                    <Setter Property="Width" Value="24"/>
                    <Setter Property="Height" Value="24"/>
                    <Setter Property="GetContentBrush_ForWhichButtonShapeProperty" Value="Stroke"/>
                </Style>
            </UserControl:TitleBarUserControl.Resources>

منظورم از استایل قبلی ، استایلِ ShapeTextButton ای هست که در DarkStyle یا LightStyle تعریف شده و کلید نداره (که اگه کلیدی نداشته باشه ، میدونید که اتوماتیک ، کلیدِ نوعِ همون المنت و همون نوع را در نظر میگیره) .


حالا مشکل اینه که هر کنترل ShapeTextButton ای که درون این TitleBarUserControl ایجاد میکنم (یعنی هر کنترل ShapeTextButton ای که استایل در کد بالا روش اِعمال میشه) ، استایلِ پیش فرض اش که هر چی باشه که این استایل پیش فرض را در Resource ئه App.Xaml اون استایل را لود کردم ، همون اِعمال میشه اما وقتی استایل در Resource ئه App.Xaml را تغییر میدم ، ShapeTextButton هایی که در TitleBarUserControl هستن ، استایلِ جدید ، روشون اِعمال نمیشه و همون استایل قدیم شون باقی میمونن .
اما ShapeTextButton هایی که استایل در کد بالا براشون اِعمال نمیشه (یعنی درون TitleBarUserControl نیستن) ، مشکلی ندارن و به درستی کار میکنن .
یکسری قواعد رو مرور کنیم. هر Style یک مشخصه BasedOn داره که مقدارش قابل تغییر ئه :
C#:
            var a = new Style();
            var b = new Style();
            var c = new Style();
            a.BasedOn = b;
            a.BasedOn = c;
اما نه بی قید و شرط، به شرطی که Style ئه Sealed نشده باشه :
C#:
public Style BasedOn
{
    get
    {
        VerifyAccess();
        return _basedOn;
    }
    set
    {
        VerifyAccess();
        if (_sealed)
        {
            throw new InvalidOperationException(SR.Get("CannotChangeAfterSealed", "Style"));
        }
        .
        .
        .
    }
}
و مشخصه Style.IsSealed توضیح داده که وقتی اون Style پایه یک Style دیگه قرار گرفت یا برای اولین بار جایی اعمال شد، Sealed میشه و دیگه نمیشه تغییراتی مثل تغییر BasedOn رو انجام داد :
A style is sealed when another style is based on it or when it is applied for the first time.​
C#:
            var bb = new Button();
            var a = new Style();
            var b = new Style();
            var c = new Style();
            a.BasedOn = b;
            bb.Style = a;
            bb.Style = null;
            a.BasedOn = c;
بنابر این اگر Style ای رو در جایی بکار بردیم، Sealed شده و دیگه نمیشه BasedOn اش رو تغییر داد، صرف نظر از اینکه منبعی که BasedOn رو مشخص می کنه StaticResource باشه یا نباشه.
پس اگر قراره با تغییراتی در یک منبع که به ما Style پایه رو میده، یک Style وراثتی در جاهایی بروز رسانی بشه، دیگه تلاش برای تغییر اون Style وارث قبلی بی فایده است، باید حتما باید یک شیء Style وارث جدید از نو ایجاد بشه و در تمامی اون المنت ها اعمال بشه، Style وارث قبلی قابل تغییر نیست.

این مشکل ، بخاطر پروپرتیِ BasedOn در کد بالا که بصورت StaticResource استفاده میشه هست؟
طبق توضیحاتی که دادم، نه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
آها پس که این طور .
تشکر استاد :rose:

استاد ، میشه FontFamily ئه ویندوز در قسمت TaskBar را تغییر داد؟
من font ئه window ام را تغییر میدم ، تغییری نمیکنه .
توی اینترنت هم گشتم ، چیز خاصی در این باره پیدا نکردم .
تشکر استاد .
 

the_king

مدیرکل انجمن
سلامی مجدد
آها پس که این طور .
تشکر استاد :rose:

استاد ، میشه FontFamily ئه ویندوز در قسمت TaskBar را تغییر داد؟
من font ئه window ام را تغییر میدم ، تغییری نمیکنه .
توی اینترنت هم گشتم ، چیز خاصی در این باره پیدا نکردم .
تشکر استاد .
به فونت پنجره ربطی نداره، تصور کنید که چند تا برنامه هر کدوم بخواهند در TaskBar با فونت دلخواه خودشون دیده بشن، منطقی نیست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد .
خیلی ممنون


نکات برای یادآوری آینده :
این نکته را برای خودم در آینده برای یادآوری میگم .
قضیه اینه که قبلا کلاس ItemsControlCustomItem را نوشته بودم (که خود این هم داستان داشت و پیشنهاد داده بودین که بجای استفاده از کلاس هایی مثل ComboBoxItem ، ازش استفاده کنم) . و به عنوان آیتم ، در کنترل هایی مثل ComboBox (و کلا ItemsControl ها) ازش استفاده میکردم .
برای این کلاس هم ، اینترفیس INotifyPropertyChanged را برای استفاده و فراخونی در پروپرتی هاش بکار بردم .
تا اینجای کار ، مشکلی نبود و درست کار میکرد .


- اما بعد گفتم که حالا اگه یه وقتی اومد که پروپرتی های ItemsControlCustomItem را خواستم به عنوان Binding Target استفاده کنم ، پس بهتره که پروپرتی هاش را DependencyProperty و در نتیجه ، خودِ ItemsControlCustomItem را هم از DependencyObject ارث بری کنم .

- این کار را که انجام دادم ، دیدم وقتی آیتمی را که از لیست کمبوباکس ام انتخاب میکنم (کمبوباکس ای که مقدار آیتم هاش و در واقع ItemsSource اش از نوع ItemsControlCustomItem هست) ، در قسمت بالا اش (یا همون در قسمت ToggleButton یا Editable اش) نمایش داده نمیشه . هر چند در قسمت لیست ها (یا همون قسمت popup) ، آیتم هاش نمایش داده میشن .
مثل تصویر زیر :

1.JPG

با اونکه آیتم اول (متن درایو c) قبلا انتخاب شده بود ، اما در قسمت بالای کمبوباکس نمایش داده نمیشه .
بعد رفتم بررسی که کردم ، دیدم توی تمپلیت ای که بکار بردم (از مایکروسافت که گرفته بودم) ، ContentPresenter ای (با نام ContentSite) گرفته بود که پروپرتیِ Content اش را به پروپرتیِ SelectionBoxItem ئه ComboBox متصل و Binding کرده بود . که مربوط به نمایش محتوا در همین ToggleButton (قسمت بالای کمبوباکس) میشه .

در Visual Studio 2022 هم اومدن هر کلاسی که نوشتن ، با تمام اعضاشون (حتی اعضای private) را حتی با سورس کد کامل در اختیارمون گذاشتن (دیگه لازم نیست با نرم افزارهای دیگه ، سورس کد را جستجو کنیم) .

عبارت "SelectionBoxItem" را جستجو کردم ، خود پروپرتی اش کد خاصی نداشت اما به متد UpdateSelectionBoxItem برخوردم .
دیدم آخر این متد ، مقدار متغییر محلیِ obj را درون پروپرتیِ SelectionBoxItem سِت میکنه .
در ابتدا که این متغییر محلیِ obj ، مقدارش را از پروپرتیِ base.InternalSelectedItem میگرفت . مقدار این پروپرتی را با ربفلکشن برای شیِ کمبوباکس ام تست کردم :

C#:
        private void SelectDriveComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox currentComboBox = sender as ComboBox;
            System.Reflection.BindingFlags bindingFlags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
            System.Reflection.PropertyInfo propertyInfo = currentComboBox.GetType().GetProperty("InternalSelectedItem", bindingFlags);
            object val = propertyInfo.GetValue(currentComboBox);
        }

دیدم مقدارش درسته (همون مقداری هست که اون آیتم را انتخاب کرده بودم . یعنی شی ای از ItemsControlCustomItem هست) .
در ادامه ی اون متد دیدم که شرط هایی میذاره و مقادیر متغییر محلی obj را تغییر میده .

==========================

- در نهایت (در این متد و همچنین در متد ExtractString که از این متد ، در شرایطی فراخونی میشد) ، شرط هایی گذاشت که خلاصه اش اینه که اگه متغییر محلی obj (همون آیتم انتخاب شده مون) ، از نوع Visual (و فرزندانش مثل ContentControl و UIElement و TextBlock) و TextElement بود ، محتوای مورد نظر را بسته به هر نوعی از اینها ، از پروپرتیِ خاصی از اینها یا به همراه فرمول خاصی ، بگیره اما اگه از نوع اینها نبود (یعنی فقط از نوع DependencyObject بود ، که شیِ ItemsControlCustomItem ما هم فقط از نوع DependencyObject هست) ، و همچنین اگه یکی از پروپرتی های ItemTemplate یا ItemTemplateSelector یا ItemStringFormat (از اعضای ItemsControl) هم مقدار نداشت ، متد ExtractString را فراخونی میکنه که این متد هم با این شرایط ، مقدار اولیه اش که رشته ی خالی هست را برمیگردونه و نهایتا از این رشته ی خالیِ برگردونده شده ، در متغییر محلیِ obj و در نهایت ، این متغییر محلی را هم در پروپرتیِ SelectionBoxItem سِت و تنظیم میکنه .


- بنابراین با مقداردهیِ یکی از این پروپرتی های ItemsControl (فرضا پروپرتیِ ItemTemplate که تمپلیتِ آیتم های ItemsControl را مشخص میکنه) ، این مشکل حل میشه .
در این کمبوباکس ام ، پروپرتیِ ItemTemplate را بصورت زیر نوشتم :

XML:
    <DataTemplate DataType="{x:Type CustomItems:ItemsControlCustomItem}" x:Key="ItemsControlCustomItem_DataTemplateKey" >
        <TextBlock Text="{Binding Path=ItemContent}"/>
    </DataTemplate>

البته ، خلاصه ی اون متد و این داستان این بود .

============================

استاد ، در Visual Studio 2022 ، هم سورس کدها و هم همه ی اعضای (حتی اعضای private) اون کلاس هایی که مایکروسافت نوشت ، قابل مشاهده هست .
البته من نمیدونم بخاطرِ نسخه ی Visual Studio 2022 اش هست یا اینکه من موقع نصب ، گزینه ای را انتخاب کردم که این ویژگی اضافه شده .

به هر حال خوبی اش اینه که دیباگ گیری (از طریق مشاهده ی کامل کد) را آسونتر میکنه اما بدیش اینه که چون همه ی اعضا مشخص هست ، خیلی شلوغ تر از قبل شده .
آیا توی تنظیمات ، گزینه ای هست که هر وقت خواستیم ، این ویژگی را فعال یا غیر فعال کنیم؟

--------

همچنین اینکه در این نسخه ، در کد سی شارپ ، در intellisense ، وقتی کد مینویسم ، توضیحات اعضاها را نمیاره .
اون اعضا ، توضیحات xaml دارن (توی نسخه های قبلی میاورد) .
چرا؟ میشه درستش کرد؟ اگه آره ، چجوری؟
تشکر استاد
 

the_king

مدیرکل انجمن
استاد ، در Visual Studio 2022 ، هم سورس کدها و هم همه ی اعضای (حتی اعضای private) اون کلاس هایی که مایکروسافت نوشت ، قابل مشاهده هست .
البته من نمیدونم بخاطرِ نسخه ی Visual Studio 2022 اش هست یا اینکه من موقع نصب ، گزینه ای را انتخاب کردم که این ویژگی اضافه شده .

به هر حال خوبی اش اینه که دیباگ گیری (از طریق مشاهده ی کامل کد) را آسونتر میکنه اما بدیش اینه که چون همه ی اعضا مشخص هست ، خیلی شلوغ تر از قبل شده .
آیا توی تنظیمات ، گزینه ای هست که هر وقت خواستیم ، این ویژگی را فعال یا غیر فعال کنیم؟

--------

همچنین اینکه در این نسخه ، در کد سی شارپ ، در intellisense ، وقتی کد مینویسم ، توضیحات اعضاها را نمیاره .
اون اعضا ، توضیحات xaml دارن (توی نسخه های قبلی میاورد) .
چرا؟ میشه درستش کرد؟ اگه آره ، چجوری؟
تشکر استاد
در مورد Visual Studio 2022 هیچ نظری ندارم، نه نصبش کردم و نه تمایلی به اینکار دارم.
اما این قابلیت نمایش کد منبع در Visual Studio نسخه های آپدیت شده قبلی (و حتی قبلتر از اون به واسطه پلاگین ها) وجود داشته، اما کدی که نشون داده میشه حاصل Decompile کردنه، کد اصلی منبع نیست. ممکنه در کد منبع هزاران سطر توضیحات اضافی باشه که دیگه ازش خبری نیست.
decompile.png
فیلد private همونقدر اهمیت داره که سایر موارد، اگر صرفا دنبال شمای کلی هستید، از Object Browser استفاده کنید که برای اینکه چی رو نشون بده یا نده تنظیم داره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
در مورد Visual Studio 2022 هیچ نظری ندارم، نه نصبش کردم و نه تمایلی به اینکار دارم.

سلامی مجدد استاد
خیلی ممنون

چرا تمایل ندارین؟
تغییرات خیلی خوبی داد . از هوش مصنوعی برای پیشنهاد برای کامل کردن کد و بهبود سرعت و عملکرد گرفته و ... .
البته گاها هوش مصنوعی اش قاتی و اشتباه میکنه :green:

من کلا خیلی دوست دارم از آخرین نسخه از برنامه ها استفاده کنم و از تغییراتِ داده شده و ویژگی های اضافه شده ، استفاده کنم (مگر اینکه اون برنامه مشکل یا باگ های غیر قابل تحمل داده باشه یا کلا بدتر شده باشه و یا مجوزش مشکل داشته باشه و ...) .
برخلاف شما :green:

اما این قابلیت نمایش کد منبع در Visual Studio نسخه های آپدیت شده قبلی (و حتی قبلتر از اون به واسطه پلاگین ها) وجود داشته، اما کدی که نشون داده میشه حاصل Decompile کردنه، کد اصلی منبع نیست. ممکنه در کد منبع هزاران سطر توضیحات اضافی باشه که دیگه ازش خبری نیست.
مشاهده پیوست 114701
فیلد private همونقدر اهمیت داره که سایر موارد، اگر صرفا دنبال شمای کلی هستید، از Object Browser استفاده کنید که برای اینکه چی رو نشون بده یا نده تنظیم داره.

آره ، Object Browser هم داره اما زمانی که میخواد بیاد بالا و جستجو کنه ، خیلی بیشتر از زمانی که Go To Definition را انتخاب میکنیم ، طول میکشه .
آره ، توضیحات در سطرهای متدها نیست .


انگار متوجه شدم .
انگار در این نسخه ی 2022 ، (وقتی روی عضوی کلیک راست کنیم) ، گزینه ای بنام "Peek Definition" (با کلید میانبر Alt+F12) داره که همین کار را میکنه (یعنی کارِِ گزینه ی "Go To Definition" در نسخه های قبلی را میکنه) و فقط اعضای public و protected از اون کلاس را لیست میکنه و میاره .

اما گزینه ی "Go To Definition" در نسخه ی 2022 ، همه ی اعضا به همراه کد منبع شون را میاره .



======================


استاد ، درباره ی اون سئوال دومی که گفتم توضیحات برای اعضا در intellisense را نمیاره ، هر چند مشکلش را هنوز پیدا نکردم اما دو نکته را فهمیدم که شاید توی درست کردنش کمک کنه :

اول اینکه توضیحات را فقط زمانی که Go To Definition را میزنم ، در اونجا ، در بالای هر عضو میاره . (زمانی که سورس کد را نمایش میده) . اون هم اعضای public . نه اینکه اعضای private و اینها هم توضیحات داشته باشن که البته توضیحات اعضای private ، برام زیاد مهم نیست هر چند باشه بهتره .

دوم اینکه در لینک زیر :


گفته که در مسیر زیر :
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework
و بعد هم اون پوشه ای که نسخه ای از دات نت فریم وورک را که در پروژه مون استفاده میکنیم (مثلا من از نسخه ی 4.5.2 در پروژه ام استفاده میکنم) ، بگردیم که در این پوشه آیا فایل های xml وجود داره یا نه .
که دیدم وجود داشت .

اما نکته اینجاست که در سیستم ام دو نسخه ی 2019 و 2022 از Visual Studio را نصب کردم .
نسخه ی 2019 که 32 بیتی هست و نسخه ی 2022 که 64 بیتی هست .
من هم که این مشکل را فقط در نسخه ی 2022 دارم .

بنابراین فکر کنم بجای مسیرِ C:\Program Files (x86) ، باید به مسیرِ C:\Program Files برای این نسخه برم . درسته؟
در این نسخه ، فقط تا پوشه ی زیر را داشت :
C:\Program Files\Reference Assemblies\Microsoft\Framework
یعنی پوشه ای بنام .NETFramework وجود نداشت .
با اینکه من تمام گزینه های .net framework را زمانی که نسخه ی 2022 را نصب کردم ، همراهش نصب کردم .
البته ، اول ، نسخه ی 2022 و بعدش نسخه ی 2019 را نصب کرده بودم .


توی این پوشه هم فقط پوشه هایی بنام v3.0 و همچنین پوشه ی v3.5 وجود دارن که فقط یکی دو فایل ئه xml درون هر کدوم از این پوشه ها وجود داشت (در اون پوشه هایی که درون مسیرِ C:\Program Files (x86) بودن ، خیلی خیلی بیشتر فایل های xml و همچنین فایل های dll وجود داشتن) .


الان به نظرتون مشکل از کجاست؟
یعنی ممکنه بعد از اینکه نسخه ی 2019 را نصب کرده بودم ، منابعِ .net framework ئه نسخه ی 2022 را حذف کرده باشه؟ (منطقی به نظر نمیاد) .
به نظرتون چی کار کنم؟
دوباره نسخه ی 2022 را نصب کنم؟ اگه آره ، repair کنم یا ، اول ، حذف و بعد مجددا نصب کنم؟
تشکر استاد.
 

the_king

مدیرکل انجمن
سلامی مجدد استاد
خیلی ممنون

چرا تمایل ندارین؟
تغییرات خیلی خوبی داد . از هوش مصنوعی برای پیشنهاد برای کامل کردن کد و بهبود سرعت و عملکرد گرفته و ... .
البته گاها هوش مصنوعی اش قاتی و اشتباه میکنه :green:
هر ویژوال استدیو جدیدی که تولید شده، ادعای بهبود سرعت و عملکرد داشته و در عین حال از نسخه قبلی سنگین تر و کندتر بوده، چون فقط بهینه سازی کد قبلی که نیست، بزرگتر و پیچیده تر و فعالیت های پشت پرده بیشتری بهش اضافه شده که عملا باعث شده هم دیرتر بالا بیاد و هم کندتر کار کنه.
و ReSharper رو هم ترجیح می دهم.
من کلا خیلی دوست دارم از آخرین نسخه از برنامه ها استفاده کنم و از تغییراتِ داده شده و ویژگی های اضافه شده ، استفاده کنم (مگر اینکه اون برنامه مشکل یا باگ های غیر قابل تحمل داده باشه یا کلا بدتر شده باشه و یا مجوزش مشکل داشته باشه و ...) .
برخلاف شما :green:
من از دید منفعت ضرر بهش نگاه می کنم، نرم افزار قراره کار من رو راه بندازه، نسخه اش که به کار من اعتبار نمیده.
این نرم افزار ها زمانی به پایداری و ثبات مطلوب می رسند که چند سال از ارائه شون گذشته باشه، یکسری قابلیت های جدید شون رو هم هیچگاه استفاده نخواهید کرد. طبعا به سخت افزار به روزتری هم نیاز دارند که باید مدام بابتش هزینه کنید که معمولا نمی کنید و تناسب سخت افزار و نرم افزار بهم میخوره. اگر بابت این تست نرم افزار تازه ارائه شده بهتون دستمزد میدادن باز یک چیزی. برای مجله فلان هم نقد و بررسی نمی نویسید که بگید مجبور بودید الان بررسی اش کنید تا مقاله رو بنویسید. اگر سر و کار تون با مشتری ها باشه هم که دیگه بدتر، برای حفظ سازگاری پروژه با نسخه های قبلی به مشکل بر میخورید. یک توازن لازم داره، نه خیلی قدیمی و نه خیلی جدید.
الان به نظرتون مشکل از کجاست؟
یعنی ممکنه بعد از اینکه نسخه ی 2019 را نصب کرده بودم ، منابعِ .net framework ئه نسخه ی 2022 را حذف کرده باشه؟ (منطقی به نظر نمیاد) .
به نظرتون چی کار کنم؟
دوباره نسخه ی 2022 را نصب کنم؟ اگه آره ، repair کنم یا ، اول ، حذف و بعد مجددا نصب کنم؟
تشکر استاد.
به نظر من مشکل از اینجا است که عجله کرده اید، باید صبر کنید که به تدریج ایرادات محصول رفع بشه.
به نظرتون چی کار کنم؟
دوباره نسخه ی 2022 را نصب کنم؟ اگه آره ، repair کنم یا ، اول ، حذف و بعد مجددا نصب کنم؟
تشکر استاد.
به نظرم فعلا از همون نسخه قبلی استفاده کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
هر ویژوال استدیو جدیدی که تولید شده، ادعای بهبود سرعت و عملکرد داشته و در عین حال از نسخه قبلی سنگین تر و کندتر بوده، چون فقط بهینه سازی کد قبلی که نیست، بزرگتر و پیچیده تر و فعالیت های پشت پرده بیشتری بهش اضافه شده که عملا باعث شده هم دیرتر بالا بیاد و هم کندتر کار کنه.

سلامی مجدد استاد .
خیلی ممنون .

البته من پروژه ی خودم را در دو نسخه ی 2019 و 2022 اجرا کردم با StopWatch ای که برنامه ی Alarm Clock داره ، نتیجه ، بد نبود . هر چند اصولی نیست و زمانی طول میکشید که من StopWatch را اجرا کنم و پروژه ی مورد نظر را کلیک کنم که در دفعات مختلف ، این دو کار ، اختلاف بازه ی زمانی متفاوتی داشت (نهایتا اختلاف این دو کارم ، کمتر از 1 ثانیه بود . البته به نظرم کمتر از نیم ثانیه بود) .

به هر حال ، دو بار که یک پروژه ، زمان لودشون ، یک Window از اون پروژه را لود میکردن ، نسخه ی 2019 ، اولین بار 12.3 و دومین بار 11.9 ثانیه طول کشید . نسخه ی 2022 هم اولین بار 10.3 و دومین بار 11.1 ثانیه طول کشید .
اختلاف من رو هم حساب کنیم ، حداقل اینکه نسخه ی 2022 ، با نسخه ی 2019 یکی بشه (خیلی کم پیش بیاد که دیرتر اجرا کنه) .

زمان اجرای پروژه هم اولین بار فرق چندانی ندارن اما از دفعات دوم به بعد ، نسخه ی 2019 حدود 3 ثانیه و نسخه ی 2022 حدود 2 ثانیه طول میکشه .
در کل ، به نظر میرسه بهتر شد .

و ReSharper رو هم ترجیح می دهم.

من Resharper کار نکردم .
Resharper ، هوش مصنوعی داره؟
البته شرکتش که jet brans هست ، هم تعریف این محصولش (Resharper) و هم تعریف نرم افزار rider اش را زیاد شنیدم .
ولی با هیچ کدوم شون کار نکردم .

الان نسخه ی 2022 ویژال استودیو ، مثلا من کلاسی به نام Student که ساختم ، بعد داخلِ بلاکِ کلاس که کلیک کردم ، حتی بدون اینکه عضو و فیلدی بنویسم ، خودش پیشنهادِ ساختِ پروپرتیِ Id و بعدش هم پیشنهاد ساخت پروپرتیِ Name را در این کلاس داد .

یا فرضا اگه متدی که چند پارامتر بگیره ، وقتی نام پروپرتی یا متغییری را بنویسیم (که طبق هوش مصنوعی اش حس کنه که میخوایم مقدار اون پارامتر را درون اون پروپرتی مون بریزیم) ، بقیه را خودش پیشنهاد میده .
در کل هوش مصنوعی اش باعث شد سریعتر کدنویسی در این نسخه انجام بشه .
هر چند خطاهایی داره و گاها (نه خیلی) ، اشتباه هم پیشنهاد میده . منظور از اشتباه اینه که اون کد ، مورد نظر ما نباشه .
فرضا :


intellicode.gif



من از دید منفعت ضرر بهش نگاه می کنم، نرم افزار قراره کار من رو راه بندازه، نسخه اش که به کار من اعتبار نمیده.
این نرم افزار ها زمانی به پایداری و ثبات مطلوب می رسند که چند سال از ارائه شون گذشته باشه، یکسری قابلیت های جدید شون رو هم هیچگاه استفاده نخواهید کرد.

بله . یکسری از قابلیت هاش هیچ وقت استفاده نمیکنم (البته شاید خیلی هاش را) .
البته چند سال که به پایداری بسیار زیادی میرسه .
ولی الان که نسخه ی 17.0.4 را دارم ، زیاد باگ نداره .
حداقل باگ ای که شدید و کلافه کننده باشه اصلا ندیدم .
البته ، چون ادعا میکنن که نسخه ی 2022 ، در xaml design اش تغییراتی داده شد ، زمان طراحی ، در پروژه های قبلی ای که توش اجرا میکنم ، ارورهایی میده که برای پروژه ی پشتیبانگیرم ، حل اش کردم . هر چند حل کردنش برام وقت گیر بود و دردسر داشت .

یعنی این ارورها در xaml designer (که حلش کردم) از نسخه های قبلی ، فکر نکنم باگ محسوب بشه . احتمال بسیار زیاد برای تغییراتی که در xaml designer ئه .net frame work دادن ، هست (که ادعا میکردن که xaml designer اش را شبیه و بر پایه ی xaml designer ئه .net نوشتن) .

هر چند باز هم xaml designer اش باگ های جزئی ای هم داره . که البته نسخه ی 2019 اش (نسخه ی 16.9.2 اش که داشتم و دارم) هم همینطور بود . نمیدونم کی قراره این باگ های xaml designer را حل کنن . سال 2006 بود که wpf را ارائه کردن!

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

نیازی نیست استاد با هر نسخه ی جدیدی ، سخت افزار تغییری کنه .
الان نسخه ی 2022 ، در اغلب اوقات ، با همون سیستم نرم افزاری و سخت افزاری ، در همون پروژه ام ، از نسخه ی 2019 ام بصورت نسبی سریعتر و قابلیت هاش هم بیشتره .
بنابراین نیازی به تغییرات سخت افزاری نیست .
البته که سخت افزار و پردازنده تا حدودی اگه سریعتر باشه ، سرعت بالاتر میره (که برای نسخه های قبل هم همین صدق میکنه) .

اگر بابت این تست نرم افزار تازه ارائه شده بهتون دستمزد میدادن باز یک چیزی. برای مجله فلان هم نقد و بررسی نمی نویسید که بگید مجبور بودید الان بررسی اش کنید تا مقاله رو بنویسید. اگر سر و کار تون با مشتری ها باشه هم که دیگه بدتر، برای حفظ سازگاری پروژه با نسخه های قبلی به مشکل بر میخورید. یک توازن لازم داره، نه خیلی قدیمی و نه خیلی جدید.

بله .
سازگاری ، مخصوصا در xaml designer که تغییراتی کرد ، در پروژه های بزرگتر که بدتر یا سخت تر هم ممکنه بشه .
یه سری هاش که ممکنه کار نکنه . فرضا مقداردهیِ استراکچرهای nullable را در xaml designer ئه نسخه ی 2019 میشد سِت کرد اما در نسخه ی 2022 نمیشه و xaml designer اش گیر میده .

به نظر من مشکل از اینجا است که عجله کرده اید، باید صبر کنید که به تدریج ایرادات محصول رفع بشه.

به نظرم فعلا از همون نسخه قبلی استفاده کنید.

راستی استاد تازه فهمیدم فقط توی این پروژه ، اون هم در نسخه ی 2022 این طوره .
یه پروژه ی دیگه را تست کردم ، درست عمل میکرد .
البته من نسخه ی .net framework ئه این پروژه را از 4.5.1 به نسخه ی 4.5.2 تغییر دادم چون زمان اجراش میگفت که نسخه ی 2022 از 4.5.1 دیگه پشتیبانی نمیکنه .
نمیدونم واسه ی این تغییر باشه یا نه .

تشکر استاد .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد

نکته برای یادآوری آینده :
هر چند چیز خاصی نیست و قبلا به صورتی مبسوط و مفهومی بحث کرده بودیم اما بخاطر اینکه هم مرور بشه و هم اینکه در قالب جملات کوتاه تر (هر چند ممکنه اصولی نباشه) بیان بشه اینکه :

- در Binding ، فرضا در کد زیر :

XML:
<Window x:Class="WPF_Practice.BindingWindow">
    <Window.DataContext>
        <local:StudentViewModel />
    </Window.DataContext>
    <Grid>
        <Label Margin="200, 50, 10, 10" Content="{Binding Path=Student.Name}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </Grid>
</Window>

بهتر اینه که هر پروپرتی ای که مقدار Path مون را شکل میده (در کد بالا هم پروپرتیِ Name و هم پروپرتیِ Student) (موقع Set در این پروپرتی ها) ، رویداد PropertyChanged (از اینترفیس INotifyPropertyChanged) را اجرا کنن .

در واقع کلاس های این پروپرتی ها که کلاس های Student (برای پروپرتی Name) و کلاس StudentViewModel (برای پروپرتیِ Student) هست ، اینترفیس INotifyPropertyChanged را پیاده سازی کنن .


- یعنی فقط به پروپرتیِ Source که پروپرتیِ Name هست ، نباید رویداد PropertyChanged را اجرا کنه .
بلکه بهتره که همه ی پروپرتی هایی که در Path ئه Binding مشخص میکنیم (از جمله پروپرتیِ Student در کد بالا) ، این رویداد را اجرا کنن .

میدونم اصولی نگفتم و نیاز به بسط و توضیح و نکات زیادی داره . اما چون قبلا کاملا مفصل توضیح داده بودید ، فقط بصورت کلی و مرور وار در قالب جمله ی کوتاه تر خواستم بگم .
تشکر استاد .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد

نکته برای یادآوری آینده :
هر چند چیز خاصی نیست و قبلا به صورتی مبسوط و مفهومی بحث کرده بودیم اما بخاطر اینکه هم مرور بشه و هم اینکه در قالب جملات کوتاه تر (هر چند ممکنه اصولی نباشه) بیان بشه اینکه :

- در Binding ، فرضا در کد زیر :

XML:
<Window x:Class="WPF_Practice.BindingWindow">
    <Window.DataContext>
        <local:StudentViewModel />
    </Window.DataContext>
    <Grid>
        <Label Margin="200, 50, 10, 10" Content="{Binding Path=Student.Name}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </Grid>
</Window>

بهتر اینه که هر پروپرتی ای که مقدار Path مون را شکل میده (در کد بالا هم پروپرتیِ Name و هم پروپرتیِ Student) (موقع Set در این پروپرتی ها) ، رویداد PropertyChanged (از اینترفیس INotifyPropertyChanged) را اجرا کنن .

در واقع کلاس های این پروپرتی ها که کلاس های Student (برای پروپرتی Name) و کلاس StudentViewModel (برای پروپرتیِ Student) هست ، اینترفیس INotifyPropertyChanged را پیاده سازی کنن .


- یعنی فقط به پروپرتیِ Source که پروپرتیِ Name هست ، نباید رویداد PropertyChanged را اجرا کنه .
بلکه بهتره که همه ی پروپرتی هایی که در Path ئه Binding مشخص میکنیم (از جمله پروپرتیِ Student در کد بالا) ، این رویداد را اجرا کنن .

میدونم اصولی نگفتم و نیاز به بسط و توضیح و نکات زیادی داره . اما چون قبلا کاملا مفصل توضیح داده بودید ، فقط بصورت کلی و مرور وار در قالب جمله ی کوتاه تر خواستم بگم .
تشکر استاد .

سلامی مجدد

ویرایش نکته :

و یا اینکه این دو پروپرتی ، از نوع DependencyProperty باشن .

یعنی پروپرتیِ Student و پروپرتیِ Name در کد بالا ، بهتره که هر دو یا رویداد PropertyChanged (از پیاده سازیِ اینترفیسِ INotifyPropertyChanged) را فراخونی کنن یا اینکه این پروپرتی ها ، از نوع DependencyProperty باشن .


که البته گفتم که فقط در قالب جمله ی کوتاه دارم میگم و اصولی نیست (که دلایلش را قبلا بصورت مبسوط توضیح دادید) .
تشکر استاد .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
همچنین اینکه در این نسخه ، در کد سی شارپ ، در intellisense ، وقتی کد مینویسم ، توضیحات اعضاها را نمیاره .
اون اعضا ، توضیحات xaml دارن (توی نسخه های قبلی میاورد) .
چرا؟ میشه درستش کرد؟ اگه آره ، چجوری؟
تشکر استاد

سلام استاد
انگار طبق لینک زیر :


Visual Studio 2022 هم بصورت رسمی از .Net Framework 4.6.1 یا پایین تر ، پشتیبانی نمیکنه .
انگار واسه ی همینه که توی پروژه ام ، توضیحات را نمیاره (نمیدونم چرا فقط با توضیحات ، در این نسخه ها از .Net Framework مشکل داره و مثلا چرا با کلاس ها و توابع اش و اینها مشکل نداره) .

نسخه ی .Net Framework در پروژه ام را روی 4.6.2 گذاشتم ، این مشکل حل شد (نسخه های بالاتر هم درست کار میکنن) .
نسخه ی اولیه ی پروژه ام روی .Net Framework 4.0 بود . الان در دو مرحله ، رسید به 4.6.2 :green: در آینده ، به 4.8 نرسه خوبه . :green:

تشکر استاد .
 

the_king

مدیرکل انجمن
سلام استاد
انگار طبق لینک زیر :


Visual Studio 2022 هم بصورت رسمی از .Net Framework 4.6.1 یا پایین تر ، پشتیبانی نمیکنه .
به به. دستشون درد نکنه، عملا ویندوز XP و Vista رو از سیستم عامل های هدف خارج می کنه. دلایل ام برای نصب نکردنش بیشتر شد.:green:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
به به. دستشون درد نکنه، عملا ویندوز XP و Vista رو از سیستم عامل های هدف خارج می کنه. دلایل ام برای نصب نکردنش بیشتر شد.:green:

سلامی مجدد استاد .
آره .
البته نسخه های 4.0 تا 4.6.1 اش که این طور نیست که در Visual Studio 2022 پشتیبانی نشه .
همه ی کارها را میشه در اون ها انجام داد منتها توضیحات را فقط توی intellisense نمیاره . نمیدونم چرا فقط با توضیحاتش مشکل داره (یعنی اگه میخواد عملی پشتیبانی نکنه ، فرضا پروژه ای که روی این target هست را میتونست پیام بده و بالا نیاره و ...) .
هر چند یه بار انگار بهم پیام داد ولی منتها در حد پیام بود ولی جز توضیحات در intellisense ، بقیه ی کارها را بدون مشکل انجام میداد .

-----------

البته سیاست های یه شرکت هست دیگه .
به نظر میاد که خیلی نمیشه روی این ها مقاومت کرد . یعنی به نظرم این بهتره که ما هم با تغییر سیاست های اون شرکت ، به همون سمت تغییر بدیم .

فرضا وقتی مایکروسافت روی مادربردهای حداقل 8 سالِ پیش تا الان ، دیگه ویندوز xp را پشتیبانی نکرد و نشد دیگه روی این مادربردها ، ویندوز xp را نصب کرد ، آروم آروم تا حالا کاربران ویندوز xp اومد پایین و الان جز سیستم های خیلی قدیمی ، ویندوز xp پیدا نمیشه (جز بصورت مجازی) .

یا فرضا به نظرم شما (ی نوعی) نمیتونید بگید که چون اون نسخه از .net framework ای که توی xp ساپورت نمیشه را در VS 2022 پشتیبانی نمیکنه ، من از VS 2022 استفاده نمیکنم . چون سیاست مایکروسافت هست که از الان تا آخر ، دیگه از این نسخه ها پشتیبانی نکنه . فرضا نسخه هایی از ویژال استودیو که در سال های 2024 یا 2026 و ... بزنه هم در اونها پشتیبانی نمیشه (تا ابد نمیشه که در نسخه های قدیمی باقی موند) . مگر اینکه خیلی از ویژگی های جدیدی که در سال ها و نسخه های بعدی میاد را بی خیال بشین .
(منظورم شخصِ شما نیست استاد ها . بصورت کلی و نظرم را میگم) .

هر چند در لینک زیر :


پایانِ پشتیبانی از نسخه های .Net Framework 4.6.2 و بعدتر ، مشخص نشد ، اما کلا این احتمال هست که در آینده (فرضا 5 تا 10 سال دیگه) ، مایکروسافت آروم آروم کلا از .Net Framework پشتیبانی نکنه (احتمال را میگم) و آروم آروم سمت پشتیبانیِ فقط .Net بره .
حتی از ویندوز ویندوز 7 هم پشتیبانی نکنه .

===============

استاد ، من با Resharper کار نکردم .
اما این قابلیت هوش مصنوعیِ VS 2022 که در پست 913 یه کم توضیح دادم و فیلم کوتاهی (از سایت مایکروسافت) ازش گذاشتم را هم انجام میده؟
من توی توضیحات Resharper ، مختصرا که سریع دیدم ، همچین چیزی نبود .
یا کلا در محصول rider اش که تعریف اینها را قبلا خیلی شنیدم .

توی هوش مصنوعیِ VS 2022 ، جالب اینجاست که اول کدها را بدونِ شیِ this پیشنهاد میداد . بعد ، من که چند بار کلمه ی this را نوشتم ، بعد از اون ، پیشنهادِ شیِ this اش بیشتر شد .
البته این بخشی از قابلیت های هوش مصنوعیِ VS 2022 هست . خودتون باید کار کنین تا ببینین فقط همین قابلیت اش ، چقدر لذت بخش هه (هر چند اشتباه هم داره) . مخصوصا اگه در نسخه های بعدی ، بهینه تر عمل کنه ... .

تشکر استاد .
 

the_king

مدیرکل انجمن
استاد ، من با Resharper کار نکردم .
اما این قابلیت هوش مصنوعیِ VS 2022 که در پست 913 یه کم توضیح دادم و فیلم کوتاهی (از سایت مایکروسافت) ازش گذاشتم را هم انجام میده؟
من توی توضیحات Resharper ، مختصرا که سریع دیدم ، همچین چیزی نبود .
یا کلا در محصول rider اش که تعریف اینها را قبلا خیلی شنیدم .
ربطی به موضوع تاپیک نداره، قبلا در مورد ReSharper بارها صحبت کردم، قابلیت هاش به مراتب بیشتر از چیزی است که الان در خود ویژوال استدیو می بینید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد .

استاد میگم Visual Studio 2022 که استفاده از رم اش زیادتر شد (که احتمالا بخاطر 64 بیتی بودنش و شاید هم ارتقاء های دیگه اش هست) ، پروژه های WPF هم که وقتی در حالت Edit و کد نوشتن در Visual Studio هستیم هم که رم بیشتری مصرف میکنن مخصوصا اگه از Visual Studio اجرا بشن (که همون مشکل نسخه ی قبل که انگار نشت داده در رم هست ، هنوز درست نشد و در هر بار اجرا و بستن برنامه از Visual Studio ، یه مقداری از داده رم پاک نمیشه) ، حالا هم که Resharper را هم نصب کردم ، همه ی اینها باعث شدن Visual Studio به معنی واقعی کلمه ، رم رو ببلعه . :green:


من همون پروژه ی بکاپ ام (که سبک هم هست) ، اجرا کردم ، یک ساعتی کدهاش را ویرایش و توی این مدت حدودا 15 بار پروژه رو اجرا کردم (به همراه 8 سربرگ در Microsoft Edge و TaskManager) ، مقدار 8.3GB حافظه ی فیزیکی (که 890 مگ اش فشرده شده) و عدد اولِ Committed اش هم 11.6GB هست .
پروسه ی Visual Studio رو 3.4GB و Microsoft Edge را 570MB برای حافظه ی فیزیکی زده هست (که البته شاید مصرفش در حافظه ی فیزیکی ، بیشتر هم باشه . نمیدونم) .
Visual Studio رو که بستم ، مصرف حافظه ی فیزیکی اومد روی 3.3GB (با 200MB فشرده سازی) و عدد اول Committed هم مقدار 4.3GB شد.

وقتی قشنگ مصرف رم حس میشه که همین پروژه بصورت WinForm باشه و همچنین در نسخه ی Visual Studio 2019 (یا نسخه ی قبل تر) و بدون Resharper اجرا بشه . در اون حالت شاید از نصف هم کمتر رم مصرف کنه یا حتی شاید کمتر از این .

این پروژه که این طوره ، پس پروژه های بزرگ (با WPF) ، چقدر رم مصرف میکنن!
آدم یاد نرم افزار افترافکت میافته :green:

==========

استاد ، اگه نشت داده برای پروسه ای وجود داشته باشه ، سیستم عامل مگه به پای اون پروسه نمینویسه؟
آخه وقتی Visual Studio باز بود ، مصرف کل حافظه ی فیزیکی 8.3GB بود در صورتی که پروسه های مربوط به Visual Studio (در سربرگ اولِ Task Manager) را مقدار 3.4GB نشون میداد .
وقتی که Visual Studio را بستم ، مقدار مصرفیِ کلِ حافظه ی فیزیکی ، 3.3GB شد .
این که اختلافش 5 گیگ میشه . پس چرا پروسه ی Visual Studio را 3.4GB نوشته بود داره حافظه ی فیزیکی رو مصرف میکنه؟
داستانش چجوریه؟!

تشکر استاد .
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا