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

the_king

مدیرکل انجمن
خیلی ممنون استاد
الان یه همچین چیزی توی resource نوشتم :

XML:
            <Style x:Key="DarkStyle">
                <Style.Resources>
                    <Style TargetType="CheckBox">
                        <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                    </Style>
                </Style.Resources>
            </Style>

            <Style x:Key="LightStyle">
                <Style.Resources>
                    <Style TargetType="CheckBox">
                        <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                    </Style>
                </Style.Resources>
            </Style>

            <ControlTemplate x:Key="checkBoxCustTemplate" TargetType="{x:Type CheckBox}">
                <!--برای این ، به پروپرتیِ Background شی Grid مقدار میدیم تا null نباشه وگرنه مشکل Hit Test بوجود میاد و در پشت زمینه ی خالیِ Border اگه کلیک شه ، تیک ای زده نمیشه-->
                <Grid Background="Transparent">

                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="16"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <Border Name="checkBorder" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Top"  Width="16" Height="16" CornerRadius="1" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1">
                        <Path x:Name="tickPath"  Stroke="{TemplateBinding BorderBrush}" StrokeThickness="1" Fill="{TemplateBinding BorderBrush}" StrokeStartLineCap="Triangle" StrokeEndLineCap="Triangle" Data="M1,7 Q3,7 5,9 Q8,4 12,2 M1,7 Q3.2,7.2 5,11 Q8.2,4.2 12,2"/>
                    </Border>

                    <ContentPresenter Grid.Column="1" Margin="4, 0, 0, 0"/>

                </Grid>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="false">
                        <Setter  TargetName="tickPath" Property="Visibility" Value="Hidden"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>

اما مشکل بزرگم اینه که همونطور که قبلا توضیح دادم ، نمیدونم چجوری از قسمت Style هایی که تعریف کردم (همون DarkStyle و LightStyle) ، به اون Border ای (بنام checkBorder) که در اون template تعریف کردم (از درون اون Style ها) دسترسی داشته باشم تا Background ئه مربوط به اون Border را در DarkStyle ، مقدار سیاه بدم و همچنین Background ئه مربوط به اون Border را در LightStyle، مقدار روشن تر بدم؟

این قضیه را چجوری باید درست کنم و کد را به چه صورتی باید بنویسم؟
XML:
    <Style x:Key="DarkStyle">
        <Style.Resources>
            <Style TargetType="CheckBox">
                <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                <Setter Property="Background" Value="Black"/>
            </Style>
        </Style.Resources>
    </Style>

    <Style x:Key="LightStyle">
        <Style.Resources>
            <Style TargetType="CheckBox">
                <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                <Setter Property="Background" Value="LightGray"/>
            </Style>
        </Style.Resources>
    </Style>

XML:
            <Border Name="checkBorder" Background="{TemplateBinding Background}" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Top"  Width="16" Height="16" CornerRadius="1" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1">
                <Path x:Name="tickPath"  Stroke="{TemplateBinding BorderBrush}" StrokeThickness="1" Fill="{TemplateBinding BorderBrush}" StrokeStartLineCap="Triangle" StrokeEndLineCap="Triangle" Data="M1,7 Q3,7 5,9 Q8,4 12,2 M1,7 Q3.2,7.2 5,11 Q8.2,4.2 12,2"/>
            </Border>
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
XML:
    <Style x:Key="DarkStyle">
        <Style.Resources>
            <Style TargetType="CheckBox">
                <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                <Setter Property="Background" Value="Black"/>
            </Style>
        </Style.Resources>
    </Style>

    <Style x:Key="LightStyle">
        <Style.Resources>
            <Style TargetType="CheckBox">
                <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                <Setter Property="Background" Value="LightGray"/>
            </Style>
        </Style.Resources>
    </Style>

XML:
            <Border Name="checkBorder" Background="{TemplateBinding Background}" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Top"  Width="16" Height="16" CornerRadius="1" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1">
                <Path x:Name="tickPath"  Stroke="{TemplateBinding BorderBrush}" StrokeThickness="1" Fill="{TemplateBinding BorderBrush}" StrokeStartLineCap="Triangle" StrokeEndLineCap="Triangle" Data="M1,7 Q3,7 5,9 Q8,4 12,2 M1,7 Q3.2,7.2 5,11 Q8.2,4.2 12,2"/>
            </Border>

ممنون استاد .
شما ، Background ئه Border را به Background ئه CheckBox ، بصورت TemplateBinding کردین تا در اون استایل که Background ئه CheckBox تغییر میکنه ، Background ئه Border هم تغییر کنه .

اما مثلا اگه من نخوام Background ئه Border را به Background ئه CheckBox ، بصورت TemplateBinding متصل کنم و بخوام کلا این دو تا با هم فرق کنن و ربطی به هم نداشته باشن و صرفا بخوام از درون اون استایل ها (DarkStyle و LightStyle) ، به Background ئه Border (که نامش checkBorder هست) دسترسی داشته باشم ، نمیشه؟
 

the_king

مدیرکل انجمن
ممنون استاد .
شما ، Background ئه Border را به Background ئه CheckBox ، بصورت TemplateBinding کردین تا در اون استایل که Background ئه CheckBox تغییر میکنه ، Background ئه Border هم تغییر کنه .

اما مثلا اگه من نخوام Background ئه Border را به Background ئه CheckBox ، بصورت TemplateBinding متصل کنم و بخوام کلا این دو تا با هم فرق کنن و ربطی به هم نداشته باشن و صرفا بخوام از درون اون استایل ها (DarkStyle و LightStyle) ، به Background ئه Border (که نامش checkBorder هست) دسترسی داشته باشم ، نمیشه؟
در مورد محدوده دسترسی اسامی داخل ControlTemplate که قبلا صحبت کرده ایم و نیازی به تکرارشون نیست.
قضیه باید برعکس باشه، این ControlTemplate ئه که باید در هنگام توصیف مقادیری رو از Style بگیره، نه اینکه Style بخواد ControlTemplate رو زیر و رو کنه تا مقدار بخشی اش رو ویرایش کنه. شما ControlTemplate رو کجا توصیف می کنید؟ همونجا مقادیر لازم رو بهش بدهید، نه اینکه اول توصیف اش کنید و بعد به فکر این باشید که چطور میشه توسط Style دستکاری اش کرد.
شما می توانید برای اون مقادیر Resource تعریف کنید، مثلا MyBackground، خیلی ساده.
XML:
    <Style x:Key="DarkStyle">
        <Style.Resources>
            <Style TargetType="CheckBox">
                <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                <Style.Resources>
                    <SolidColorBrush x:Key="MyBackground" Color="Black"/>
                </Style.Resources>
            </Style>
        </Style.Resources>
    </Style>

    <Style x:Key="LightStyle">
        <Style.Resources>
            <Style TargetType="CheckBox">
                <Setter Property="Template" Value="{DynamicResource checkBoxCustTemplate}"/>
                <Style.Resources>
                    <SolidColorBrush x:Key="MyBackground" Color="LightGray"/>
                </Style.Resources>
            </Style>
        </Style.Resources>
    </Style>

XML:
<Border Name="checkBorder" Background="{DynamicResource ResourceKey=MyBackground}" ...
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
نمیدونم چرا مسئله ی به این سادگی را قاتی کردم :)
------------------
استاد ، میگم حالا اگه این style ها (و کلا اون کدهای xaml که داده بودم) را در فایل app.xaml تعریف کرده باشم و همچنین در Resource ئه مربوط به Window ، الحاق نکرده باشم (یعنی کد زیر را که داده بودین ، را انجام نداده باشم) :

XML:
<Window.Resources>
        <ResourceDictionary Source="Dictionary1.xaml" />
    </Window.Resources>

و حالا بخوام در زمان اجرا (در کد سی شارپ) ، اطلاعات فایل app.xaml را به عنوان شی ResourceDictionary بخونم تا کلیدی (مثلا کلید DarkStyle) را پیدا کنم ، باید چی کار کنم؟
کد زیر را نوشتم :
C#:
            ResourceDictionary resDic = new ResourceDictionary();
            resDic.Source = new Uri("App.xaml",UriKind.Relative);

اما خطای زیر را میده :

کد:
System.Windows.Markup.XamlParseException: ''The invocation of the constructor on type 'WPF_Practice.App' that matches the specified binding constraints threw an exception.' Line number '4' and line position '14'.'

Inner Exception
InvalidOperationException: Cannot create more than one System.Windows.Application instance in the same AppDomain.

چجوری میشه اطلاعات فایل app.xaml را به عنوان شی ResourceDictionary بخونم؟
تشکر استاد .
 

the_king

مدیرکل انجمن
استاد ، میگم حالا اگه این style ها (و کلا اون کدهای xaml که داده بودم) را در فایل app.xaml تعریف کرده باشم و همچنین در Resource ئه مربوط به Window ، الحاق نکرده باشم (یعنی کد زیر را که داده بودین ، را انجام نداده باشم) :

XML:
<Window.Resources>
        <ResourceDictionary Source="Dictionary1.xaml" />
    </Window.Resources>

و حالا بخوام در زمان اجرا (در کد سی شارپ) ، اطلاعات فایل app.xaml را به عنوان شی ResourceDictionary بخونم تا کلیدی (مثلا کلید DarkStyle) را پیدا کنم ، باید چی کار کنم؟
کد زیر را نوشتم :
C#:
            ResourceDictionary resDic = new ResourceDictionary();
            resDic.Source = new Uri("App.xaml",UriKind.Relative);

اما خطای زیر را میده :

کد:
System.Windows.Markup.XamlParseException: ''The invocation of the constructor on type 'WPF_Practice.App' that matches the specified binding constraints threw an exception.' Line number '4' and line position '14'.'

Inner Exception
InvalidOperationException: Cannot create more than one System.Windows.Application instance in the same AppDomain.

چجوری میشه اطلاعات فایل app.xaml را به عنوان شی ResourceDictionary بخونم؟
تشکر استاد .
مگه ResourceDictionary رو در App.xaml اضافه نکرده اید؟ دیگه چرا مجددا میخونیدش. میشه Application.Current.Resources یا App.Current.Resources
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
مگه ResourceDictionary رو در App.xaml اضافه نکرده اید؟ دیگه چرا مجددا میخونیدش. میشه Application.Current.Resources یا App.Current.Resources

ممنون استاد
متوجه شدم استاد . ارورش بخاطر اینه که نمیتونه بیشتر از یه بار شی ای از Application درست کنه (که قبلا درست کرد) . البته باز هم من دقیق متوجه نشدم . چون من که شی ای از Application در کدم درست نکردم . حالا اگه داخل کدها و اون کلاس ResourceDictionary یا متد سازنده اش ، شی ای درست کرده باشه یا نه رو نمیدونم .

همونطور که گفتید ، باید از Resource ئه مربوط به شیِ Application ئه جاری (یعنی از Application.Current) استفاده کنیم تا دوباره شی ای نسازه :

C#:
this.Style = (Style)Application.Current.Resources["BlueStyle"];


نکردم؟ اون "Style="{DynamicResource ResourceKey=RedStyle} پس Style کدوم المنت ئه؟ "Title="MainWindow عنوان پنجره اصلی نیست؟

راستی استاد ، در اینجا ، منظورم اینه که در Resource ، فقط برای combobox ، استایل تعریف شد . یعنی برای window ، استایل تعریف نشد .
اما وقتی استایل را به window دادید ، همه ی فرزندانش که براشون استایل تعریف کرده بودیم (مثل checkbox) ، دارای اون استایل شدن .

میگم یعنی وقتی برای یه کنترل ، استایلی بدیم (مثل همین کنترل window که استایل دادیم) ، هر فرزندِ اون کنترل که براش استایل تعریف شده باشه ، دارای اون استایل میشه؟
در واقع چرا و چجوری هه که این طور میشه؟

اگر از StaticResource استفاده کنم بهتر نیست چون موقع فراخوانی المنت پنجره قبل از اینکه ResourceDictionary پردازش بشه Style میخواد تعیین بشه و هنوز Dictionary1 فراخوانی نشده که RedStyle ای موجود باشه.

بله .
StaticResource که کنم ، ارور میده .
استاد ، پس چرا توی بقیه ی مواردی که از StaticResource استفاده میکنیم ، ارور نمیده؟
یعنی فرق این ، با اونهایی که از StaticResource استفاده میکنیم و ارور نمیدن ، چیه؟

مثلا من در قسمت کد استایل ای که برای Window ست کردیم ، StaticResource کنم ، اروری نمیده :

XML:
Style="{StaticResource DarkStyle}"

اما برای اون قسمتی که در قسمت تعریف استایل ها (مثلا DarkStyle) ، بصورت DynamicResource متصل کرده بودیم را اگه بخوام بصورت StaticResource کنم ، ارور میده . یعنی کد زیر ارور میده :

XML:
<Setter Property="Template" Value="{StaticResource checkBoxCustTemplate}"/>

چه فرقی بین این دو نوع کد هست؟
که StaticResource در یکی ، ارور نمیده و در یکی دیگه ، ارور میده؟

-----------------------------

استاد ، چرا بعضی از لینک های مایکروسافت ، مثل لینک زیر ، برام باز نمیشه و ارور 404 میده؟ :


چند تا از لینک های مایکروسافت امروز برام همینطور بود .
برای شما هم همینطوره؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
راستی استاد ، در اینجا ، منظورم اینه که در Resource ، فقط برای combobox ، استایل تعریف شد . یعنی برای window ، استایل تعریف نشد .
اما وقتی استایل را به window دادید ، همه ی فرزندانش که براشون استایل تعریف کرده بودیم (مثل checkbox) ، دارای اون استایل شدن .
در اون <"Style x:Key="DarkStyle> مقدار TargetType می بینید؟ به نوع خاصی محدود نشده، پس برای Window و سایر کنترل ها معتبر ئه و Window رو هم شامل میشه.

میگم یعنی وقتی برای یه کنترل ، استایلی بدیم (مثل همین کنترل window که استایل دادیم) ، هر فرزندِ اون کنترل که براش استایل تعریف شده باشه ، دارای اون استایل میشه؟
به شرطی که با نوع اش مطابقت داشته باشه.
در واقع چرا و چجوری هه که این طور میشه؟
سلسله مراتب ئه دیگه. یک ویژگی در سلسله مراتب به ارث میرسه. وارثین یک کلاس چرا ویژگی های والد رو به ارث می برند؟

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

مثلا من در قسمت کد استایل ای که برای Window ست کردیم ، StaticResource کنم ، اروری نمیده :
XML:
Style="{StaticResource DarkStyle}"
اما برای اون قسمتی که در قسمت تعریف استایل ها (مثلا DarkStyle) ، بصورت DynamicResource متصل کرده بودیم را اگه بخوام بصورت StaticResource کنم ، ارور میده . یعنی کد زیر ارور میده :

XML:
<Setter Property="Template" Value="{StaticResource checkBoxCustTemplate}"/>

چه فرقی بین این دو نوع کد هست؟
که StaticResource در یکی ، ارور نمیده و در یکی دیگه ، ارور میده؟
سه تا مرحله است، مرحله اول فراخوانی ResourceDictionary، یعنی Dictionary1.xaml یا هر فایل دیگری فراخوانی شده باشه.
مرحله دوم اینه که اون ResourceDictionary برای اون المنت قابل دسترسی بشه، یعنی فرضا به Resources خودش یا والدین اش اضافه شده باشه.
مرحله سوم اینه که به اون Key اشاره کنید تا مدخل از ResourceDictionary خونده بشه.
خطا وقتی رخ میده که مرحله سوم پیش از یکی از دو مرحله قبلی رخ بده، مثلا ResourceDictionary فراخوانی شده، ولی قبل از اینکه به Resources اضافه بشه خواسته به مدخل فلان دسترسی پیدا کنه که پیدا نمیشه.
ترتیب این مراحل رو برای هر موردی که بررسی کنید متوجه می شوید که چرا خطا میده یا نمیده.

استاد ، چرا بعضی از لینک های مایکروسافت ، مثل لینک زیر ، برام باز نمیشه و ارور 404 میده؟ :


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

SajjadKhati

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

ممنون استاد .
خوب چجوری میتونم کدهای xaml را trace کنم تا ببینم این مراحل به ترتیب انجام میشه یا نه؟ مگه راهی داره؟

حالا چطور میشه وقتی بجای StaticResource ، اون DynamicResource را جایگزین میکنیم ، ترتیب این مراحل درست میشه؟!

درباره ی بقیه ی جواب ها هم خیلی ممنون.
 

the_king

مدیرکل انجمن
ممنون استاد .
خوب چجوری میتونم کدهای xaml را trace کنم تا ببینم این مراحل به ترتیب انجام میشه یا نه؟ مگه راهی داره؟
XAML فایل متنی ئه، از بالا به پایین و از والد به فرزند تحلیلش کنید. شروع هم که از App.xaml ئه.

حالا چطور میشه وقتی بجای StaticResource ، اون DynamicResource را جایگزین میکنیم ، ترتیب این مراحل درست میشه؟!
به منبعی که StaticResource مشخص میکنه صرفا باید یکبار رجوع بشه، یعنی در اولین نیاز باید در دسترس باشه، دریافت بشه و بعدا از همون مقدار دریافت شده استفاده بشه. اگر بعدا تغییری هم کرد تاثیری نداره. برای همین موقع پردازش xaml میخواد از منبع مقدار بگیره که چون هنوز در دسترس نیست خطا میده.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
استاد ، در استایل combobox ئه زیر ، وقتی حالت editable اش را فعال میکنیم ، کار نمیکنه . یعنی متنی که قابلیت نوشتن داشته باشه را نداره و کلا متنِ combobox ناپدید میشه . مشکل از کجاست و چجوری باید کد را ویرایش کرد؟ :

XML:
            <!-- SimpleComboBox -->
            <Style x:Key="SimpleComboBox" TargetType="{x:Type ComboBox}">
                <Setter Property="SnapsToDevicePixels" Value="False"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBox}">
                            <Grid>
                                <!--Template="{DynamicResource ComboBoxTextBox}"-->

                                <!--The ToggleButton is databound to the ComboBox itself to toggle IsDropDownOpen-->
                                <ToggleButton Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="False" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                                <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>

                                <!--The TextBox must be named PART_EditableTextBox or ComboBox will not recognize it-->
                                <TextBox Visibility="Hidden" HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="PART_EditableTextBox" VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
                                <!--The Popup shows the list of items in the ComboBox. IsOpen is databound to IsDropDownOpen which is toggled via the ComboBoxToggleButton-->
                                <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="PART_Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                                    <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                                        <Border x:Name="DropDownBorder" Background="{DynamicResource WindowBackgroundBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1"/>
                                        <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">

                                            <ItemsPresenter />

                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <!--This forces the DropDown to have a minimum size if it is empty-->
                                <Trigger Property="HasItems" Value="false">
                                    <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
                                <Trigger Property="AllowsTransparency" SourceName="PART_Popup" Value="true">
                                    <Setter Property="CornerRadius" Value="4" TargetName="DropDownBorder"/>
                                    <Setter Property="Margin" Value="0,2,0,0" TargetName="DropDownBorder"/>
                                </Trigger>
                              
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="20"/>
                    </Grid.ColumnDefinitions>
                    <Rectangle Grid.ColumnSpan="2" HorizontalAlignment="Stretch" x:Name="Rectangle" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource NormalBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Rectangle Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource WindowBackgroundBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Path Grid.Column="1" HorizontalAlignment="Center" x:Name="Arrow" VerticalAlignment="Center" Fill="{DynamicResource GlyphBrush}" Data="M 0 0 L 4 4 L 8 0 Z"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource MouseOverBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource PressedBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Fill" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Rectangle"/>
                        <Setter Property="Stroke" Value="{DynamicResource DisabledBorderBrush}" TargetName="Rectangle"/>
                        <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                        <Setter Property="Fill" Value="{DynamicResource DisabledForegroundBrush}" TargetName="Arrow"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>

در لینک زیر ، با فعال کردن قابلیت IsEditable ، این مشکل وجود نداره :



حالا بازم دقیق نمیدونم مشکل از کجاست . بررسی کنم .
ممنون استاد :rose:
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، در استایل combobox ئه زیر ، وقتی حالت editable اش را فعال میکنیم ، کار نمیکنه . یعنی متنی که قابلیت نوشتن داشته باشه را نداره و کلا متنِ combobox ناپدید میشه . مشکل از کجاست و چجوری باید کد را ویرایش کرد؟ :

XML:
            <!-- SimpleComboBox -->
            <Style x:Key="SimpleComboBox" TargetType="{x:Type ComboBox}">
                <Setter Property="SnapsToDevicePixels" Value="False"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBox}">
                            <Grid>
                                <!--Template="{DynamicResource ComboBoxTextBox}"-->

                                <!--The ToggleButton is databound to the ComboBox itself to toggle IsDropDownOpen-->
                                <ToggleButton Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="False" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                                <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>

                                <!--The TextBox must be named PART_EditableTextBox or ComboBox will not recognize it-->
                                <TextBox Visibility="Hidden" HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="PART_EditableTextBox" VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
                                <!--The Popup shows the list of items in the ComboBox. IsOpen is databound to IsDropDownOpen which is toggled via the ComboBoxToggleButton-->
                                <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="PART_Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                                    <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                                        <Border x:Name="DropDownBorder" Background="{DynamicResource WindowBackgroundBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1"/>
                                        <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">

                                            <ItemsPresenter />

                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <!--This forces the DropDown to have a minimum size if it is empty-->
                                <Trigger Property="HasItems" Value="false">
                                    <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
                                <Trigger Property="AllowsTransparency" SourceName="PART_Popup" Value="true">
                                    <Setter Property="CornerRadius" Value="4" TargetName="DropDownBorder"/>
                                    <Setter Property="Margin" Value="0,2,0,0" TargetName="DropDownBorder"/>
                                </Trigger>
                             
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="20"/>
                    </Grid.ColumnDefinitions>
                    <Rectangle Grid.ColumnSpan="2" HorizontalAlignment="Stretch" x:Name="Rectangle" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource NormalBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Rectangle Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource WindowBackgroundBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Path Grid.Column="1" HorizontalAlignment="Center" x:Name="Arrow" VerticalAlignment="Center" Fill="{DynamicResource GlyphBrush}" Data="M 0 0 L 4 4 L 8 0 Z"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource MouseOverBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource PressedBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Fill" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Rectangle"/>
                        <Setter Property="Stroke" Value="{DynamicResource DisabledBorderBrush}" TargetName="Rectangle"/>
                        <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                        <Setter Property="Fill" Value="{DynamicResource DisabledForegroundBrush}" TargetName="Arrow"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>

در لینک زیر ، با فعال کردن قابلیت IsEditable ، این مشکل وجود نداره :



حالا بازم دقیق نمیدونم مشکل از کجاست . بررسی کنم .
ممنون استاد :rose:
طول و عرض TextBox مهم نیست؟ "HorizontalAlignment="Stretch" VerticalAlignment="Stretch که نداره، ظاهرا HorizontalContentAlignment رو با HorizontalAlignment و VerticalContentAlignment رو با VerticalAlignment اشتباه گرفته اید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
طول و عرض TextBox مهم نیست؟ "HorizontalAlignment="Stretch" VerticalAlignment="Stretch که نداره، ظاهرا HorizontalContentAlignment رو با HorizontalAlignment و VerticalContentAlignment رو با VerticalAlignment اشتباه گرفته اید.

ممنون استاد .
البته کد من نیست . کدی هه که قبلا از مایکروسافت گرفتم و الان اون لینکش کار نمیکنه (صفحه ی ComboBox Style And Template بود) .
این تغییرات را روی TextBox دادم اما بازم درست نشد .
 

the_king

مدیرکل انجمن
ممنون استاد .
البته کد من نیست . کدی هه که قبلا از مایکروسافت گرفتم و الان اون لینکش کار نمیکنه (صفحه ی ComboBox Style And Template بود) .
این تغییرات را روی TextBox دادم اما بازم درست نشد .
کد تا وقتی کد مایکروسافت ئه که ویرایش اش نکنید، وقتی دستکاری اش کردید که دیگه کد مایکروسافت نیست.

 

SajjadKhati

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


ممنون استاد .
استاد ، چی رو جستجو کردین که این رو واستون آورد؟
من جستجو میکردم ، لینک زیر را واسم میاورد که باز نمیشه :


راستی استاد ، تازه یادم اومد که کدی که دادم را از اون لینک ComboBox Style And Template نگرفته بودم .
اون کد را از فایل Simple Styles.xaml گرفتم . نمیدونم این فایل را بصورت پیش فرض خود مایکروسافت در پروژه های wpf گذاشت یا از سایت یا جایی دانلود کرده بودم .

به هر حال ، آیا میشه اون کد را جوری ویرایش کرد که textbox اش کار کنه و قابلیت نوشتن (قابلیت ویرایش combobox) را داشته باشه؟
 

the_king

مدیرکل انجمن
ممنون استاد .
استاد ، چی رو جستجو کردین که این رو واستون آورد؟
من جستجو میکردم ، لینک زیر را واسم میاورد که باز نمیشه :


راستی استاد ، تازه یادم اومد که کدی که دادم را از اون لینک ComboBox Style And Template نگرفته بودم .
اون کد را از فایل Simple Styles.xaml گرفتم . نمیدونم این فایل را بصورت پیش فرض خود مایکروسافت در پروژه های wpf گذاشت یا از سایت یا جایی دانلود کرده بودم .

به هر حال ، آیا میشه اون کد را جوری ویرایش کرد که textbox اش کار کنه و قابلیت نوشتن (قابلیت ویرایش combobox) را داشته باشه؟
بله. ویرایش اش کنید و طبق اون چیزی که مایکروسافت نوشته بنویسید تا کار کنه.
 

SajjadKhati

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

سلامی مجدد
استاد ، کدی که در پست 330 دادم را بصورت زیر ویرایش کردم ، درست شد :

XML:
            <Style x:Key="SimpleComboBox" TargetType="{x:Type ComboBox}">
                <Setter Property="SnapsToDevicePixels" Value="False"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBox}">
                            <Grid>
                                <!--Template="{DynamicResource ComboBoxTextBox}"-->

                                <!--The ToggleButton is databound to the ComboBox itself to toggle IsDropDownOpen-->
                                <ToggleButton Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="False" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                                <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Top" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>

                                <!--The TextBox must be named PART_EditableTextBox or ComboBox will not recognize it-->
                                <TextBox   Visibility="Hidden" HorizontalAlignment="Stretch" Margin="3,3,23,3" x:Name="PART_EditableTextBox" VerticalAlignment="Stretch" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
                                <!--The Popup shows the list of items in the ComboBox. IsOpen is databound to IsDropDownOpen which is toggled via the ComboBoxToggleButton-->
                                <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="PART_Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                                    <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                                        <Border x:Name="DropDownBorder" Background="{DynamicResource WindowBackgroundBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1"/>
                                        <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">

                                            <ItemsPresenter />

                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <!--This forces the DropDown to have a minimum size if it is empty-->
                                <Trigger Property="HasItems" Value="false">
                                    <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
                                <Trigger Property="AllowsTransparency" SourceName="PART_Popup" Value="true">
                                    <Setter Property="CornerRadius" Value="4" TargetName="DropDownBorder"/>
                                    <Setter Property="Margin" Value="0,2,0,0" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEditable" Value="true">
                                    <Setter Property="IsTabStop" Value="false"/>
                                    <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="20"/>
                    </Grid.ColumnDefinitions>
                    <Rectangle Grid.ColumnSpan="2" HorizontalAlignment="Stretch" x:Name="Rectangle" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource NormalBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Rectangle Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource WindowBackgroundBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Path Grid.Column="1" HorizontalAlignment="Center" x:Name="Arrow" VerticalAlignment="Center" Fill="{DynamicResource GlyphBrush}" Data="M 0 0 L 4 4 L 8 0 Z"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource MouseOverBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource PressedBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Fill" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Rectangle"/>
                        <Setter Property="Stroke" Value="{DynamicResource DisabledBorderBrush}" TargetName="Rectangle"/>
                        <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                        <Setter Property="Fill" Value="{DynamicResource DisabledForegroundBrush}" TargetName="Arrow"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>


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

ممکنه هم بگید واسه ی بخش کد زیر هه که در کد بالا اضافه شده :

کد:
<Trigger Property="IsEditable" Value="true">
                                    <Setter Property="IsTabStop" Value="false"/>
                                    <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>
                                </Trigger>

اما بخاطر این هم فکر نکنم باشه . چون قبلا این کد بود و کار نمیکرد . این رو برای تست ، برداشته بودم .


شما نمیدونین این کد با کد پست 330 ، چه فرقی داره که اون فرقش باعث شد این قضیه خوب بشه؟
 

the_king

مدیرکل انجمن
سلامی مجدد
استاد ، کدی که در پست 330 دادم را بصورت زیر ویرایش کردم ، درست شد :

XML:
            <Style x:Key="SimpleComboBox" TargetType="{x:Type ComboBox}">
                <Setter Property="SnapsToDevicePixels" Value="False"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBox}">
                            <Grid>
                                <!--Template="{DynamicResource ComboBoxTextBox}"-->

                                <!--The ToggleButton is databound to the ComboBox itself to toggle IsDropDownOpen-->
                                <ToggleButton Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="False" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                                <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Top" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>

                                <!--The TextBox must be named PART_EditableTextBox or ComboBox will not recognize it-->
                                <TextBox   Visibility="Hidden" HorizontalAlignment="Stretch" Margin="3,3,23,3" x:Name="PART_EditableTextBox" VerticalAlignment="Stretch" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
                                <!--The Popup shows the list of items in the ComboBox. IsOpen is databound to IsDropDownOpen which is toggled via the ComboBoxToggleButton-->
                                <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="PART_Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                                    <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                                        <Border x:Name="DropDownBorder" Background="{DynamicResource WindowBackgroundBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1"/>
                                        <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">

                                            <ItemsPresenter />

                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <!--This forces the DropDown to have a minimum size if it is empty-->
                                <Trigger Property="HasItems" Value="false">
                                    <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
                                <Trigger Property="AllowsTransparency" SourceName="PART_Popup" Value="true">
                                    <Setter Property="CornerRadius" Value="4" TargetName="DropDownBorder"/>
                                    <Setter Property="Margin" Value="0,2,0,0" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEditable" Value="true">
                                    <Setter Property="IsTabStop" Value="false"/>
                                    <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="20"/>
                    </Grid.ColumnDefinitions>
                    <Rectangle Grid.ColumnSpan="2" HorizontalAlignment="Stretch" x:Name="Rectangle" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource NormalBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Rectangle Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" RadiusX="5" RadiusY="5" Fill="{DynamicResource WindowBackgroundBrush}" Stroke="{DynamicResource NormalBorderBrush}"/>
                    <Path Grid.Column="1" HorizontalAlignment="Center" x:Name="Arrow" VerticalAlignment="Center" Fill="{DynamicResource GlyphBrush}" Data="M 0 0 L 4 4 L 8 0 Z"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource MouseOverBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="true">
                        <Setter Property="Fill" Value="{DynamicResource PressedBrush}" TargetName="Rectangle"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Fill" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Rectangle"/>
                        <Setter Property="Stroke" Value="{DynamicResource DisabledBorderBrush}" TargetName="Rectangle"/>
                        <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                        <Setter Property="Fill" Value="{DynamicResource DisabledForegroundBrush}" TargetName="Arrow"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>


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

ممکنه هم بگید واسه ی بخش کد زیر هه که در کد بالا اضافه شده :

کد:
<Trigger Property="IsEditable" Value="true">
                                    <Setter Property="IsTabStop" Value="false"/>
                                    <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>
                                </Trigger>

اما بخاطر این هم فکر نکنم باشه . چون قبلا این کد بود و کار نمیکرد . این رو برای تست ، برداشته بودم .


شما نمیدونین این کد با کد پست 330 ، چه فرقی داره که اون فرقش باعث شد این قضیه خوب بشه؟
تغییر خاص یعنی چی؟ موارد رو بر چه اساسی ارزش گذاری کردین که امتیاز کمی آوردن؟ اگه اینها چیز خاصی نیستند برای چی نوشته میشن؟
اینکه PART_EditableTextBox در حالت Visible قرار بگیره یا نگیره چیز خاصی نیست؟ با اینکه PART_EditableTextBox همیشه پنهان باشه مشکلی ندارید؟
اینکه در حالت Editable المنت ContentSite مخفی بشه چیز خاصی نیست؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
استاد ، در همون کدی که برای تمپلیتِ combobox دادم ، یه مشکلی دارم که در زیر میگم (بخش کوتاهی از کد که مربوط به مشکلم هست را در زیر میدم اما کل کد را آخر پست میدم) .

اینکه Foreground ئه TextBox ای که در Template ئه Combobox نوشته شد را به Foreground ئه Combobox متصل کردم (TemplateBinding کردم) . بعد که در Trigger های مربوط به Combobox ، مقدار Foreground ئه Combobox را عوض میکنم ، مقدارِ Foreground ئه TextBox که متصل شده ، عوض نمیشه . چرا؟
این که با TemplateBinding ، متصل شده ، پس با تغییر مقدار Foreground ئه Combobox ، باید مقدار Foreground ئه TextBox هم تغییر کنه .

در Template ئه Combobox :

XML:
<TextBox x:Name="PART_EditableTextBox" Template="{DynamicResource TextBoxOfComboBoxTemplate}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,20,0" Focusable="True" Background= "{DynamicResource TextBoxOfComboBoxBackground}" Foreground="{TemplateBinding Foreground}" Visibility="Hidden" IsReadOnly="{TemplateBinding IsReadOnly}" BorderBrush="{TemplateBinding BorderBrush}"/>

در قسمتِ Trigger های Template ئه Combobox :

XML:
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="Blue"/>
</Trigger>

پروپرتیِ IsEditable ئه TextBox باید فعال باشه و پروپرتیِ IsEnable اش باید غیر فعال باشه .
کل کدهای این قضیه را در فایل ، ضمیمه میکنم .


استاد ، در اون تاپیک سیستم عامل ، نظرتون را میگین؟ چون اینکه بدونم اون سیستم عامل windows core os ، قابلیت رقابت با اندروید را خواهد داشت یا نه ، خیلی توی استراتژی اینکه به کدوم تکنولوژی از ویژال استودیو برم و بنابراین وقتم هدر نره ، موثره . مثلا اگه بدونم احتمال موفقیت اش بالاست ، بجای اینکه وقتم را در آینده صرف زامارین کنم ، به سمت uwp و یا سمت .net core در wpf میرم .
البته قطعا ، این در حد نظره و حتی شاید خود مایکروسافت هم از سرنوشتش خبر نداشته باشه .

ممنون استاد .
 

پیوست ها

  • combobox template.txt
    10.6 کیلوبایت · بازدیدها: 2

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، در همون کدی که برای تمپلیتِ combobox دادم ، یه مشکلی دارم که در زیر میگم (بخش کوتاهی از کد که مربوط به مشکلم هست را در زیر میدم اما کل کد را آخر پست میدم) .

اینکه Foreground ئه TextBox ای که در Template ئه Combobox نوشته شد را به Foreground ئه Combobox متصل کردم (TemplateBinding کردم) . بعد که در Trigger های مربوط به Combobox ، مقدار Foreground ئه Combobox را عوض میکنم ، مقدارِ Foreground ئه TextBox که متصل شده ، عوض نمیشه . چرا؟
اینطوری نمی توانم راهنمایی کنم، باید بدونم کد کامل تون چیه، چیزی که پیوست کردید با توضیح Trigger ای که می دهید نمیخونه، در فایل پیوستی شما "Value="Blue نیست. احتمالا دارید در دو بخش متفاوت Setter هایی رو اجرا می کنید که تاثیر همدیگه رو از بین می برند.

استاد ، در اون تاپیک سیستم عامل ، نظرتون را میگین؟ چون اینکه بدونم اون سیستم عامل windows core os ، قابلیت رقابت با اندروید را خواهد داشت یا نه ، خیلی توی استراتژی اینکه به کدوم تکنولوژی از ویژال استودیو برم و بنابراین وقتم هدر نره ، موثره . مثلا اگه بدونم احتمال موفقیت اش بالاست ، بجای اینکه وقتم را در آینده صرف زامارین کنم ، به سمت uwp و یا سمت .net core در wpf میرم .
البته قطعا ، این در حد نظره و حتی شاید خود مایکروسافت هم از سرنوشتش خبر نداشته باشه .
نظری ندارم ولی احتمال موفقیت یا عدم موفقیت شما هم ابدا ربطی به رقابت تکنولوژی ها نداره، تسلط روی یک تکنولوژی هم راحت چند سال طول میکشه، رقابت هم همیشه هست. موفقیت صرفا به مهارت و نبوغ خودتون بستگی داره. هنوز با تکنولوژی های منسوخ بیست سال پیش دارن نرم افزار توسعه میدن. وقت شما وقتی هدر میره که زمان صرف کاری کنید که الان و در این لحظه قصد استفاده اش رو ندارید، آینده نگری برای علمی که دائم در حالت تحول ئه سودی نداره.
 

SajjadKhati

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

خیلی ممنون استاد . :rose:
فایل کامل کد را در زیر پیوست میکنم .

---------------------------------

استاد ، من Ctrl+M+L را در قسمت کدنویسی میزنم و کدها همه collapse و جمع میشن .
حالا در ویژال استودیو راهی نداره که حالا اگه بخوایم فقط یه تَگ از کد را تا آخر باز کنیم ، این کار را بتونیم فقط برای اون بخش و تگ انجام بدیم؟
چون تگ های template معمولا خیلی بزرگن و هر بار که وارد ویژال استودیو میشیم ، وقت میبره تا تگ هاش را تا آخرِ اون تگ ، expand کنیم .

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

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

منظورم اینه که استاد مثلا من قصد دارم برم برنامه نویسی موبایل را یاد بگیرم .
اول باید سیستم عامل ام را مشخص کنم . اندروید (با زامارین یا حتی android studio) یا windows core os .
شناخت بسیار کمی از اندروید دارم . پس شناخت بیشتر روی سیستم عامل اندروید و یادگیری تکنولوژی زامارین و کار کردن با api های اندروید ، یه زمان قابل توجهی را ازم میگیره .

اما بیاد و سال های بعد ، windows core os ، در حد اندروید استودیو ، کاربر داشت . یعنی مثلا 40 درصد موبایل ها ، اندروید نصب کردن و 40 درصد دیگه شون windows core os و 20 درصد هم بقیه ی سیستم عامل را .

خوب در این صورت ، از همین الان کوچ کردن به سمت .net core و uwp ، خیلی خیلی از هر جهت به نفع مه . چون هم با نوشتن یک برنامه ، در همه ی سیستم عامل های windows core os (از pc تا موبایل و ...) اجرا میشن که این مزیت بسیار بزرگی هست .
مزیت دیگه اش برام اینه که من به سیستم عامل ویندوز ، خیلی اطلاعات بیشتر و مسلط تر از اندروید هستم و نیازی نیست وقتم را صرف یادگیری بخش هایی از سیستم عامل اندروید که به برنامه نویسی انروید مرتبط هه کنم (از api های اندروید گرفته تا هر سرویس و چیزهای دیگه) .
مزیت بعدیش اینه که کوچ کردن از wpf به دات net core یا به uwp ، علی الظاهر باید خیلی راحت تر از یادگیری تکنولوژی هایی مثل زامارین و api های اندروید و ... باشه .

کلا از هر نظر به نفع مه که برنامه ام را تحت ویندوز بسازم (اگه بدونم windows core os ، حتی موفقیت نسبی داره . مثلا 50 درصد موبایل ها در سال های آینده ، اندروید و 30 درصد ، windows core os را نصب میکنن ، باز هم به نفع مه . یعنی کلا این سیستم عامل ، به یه موفقیت نسبی ، نسبت به الانش دست پیدا میکنه) .

ممنون استاد
 

پیوست ها

  • Combobox Templated.txt
    36.7 کیلوبایت · بازدیدها: 2

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

بالا