the_king
مدیرکل انجمن
استفاده از کد #C که ایراد یا امتیاز منفی محسوب نمیشه. اینکه کدی ننویسید رو برای خودتون چالش نکنید، فقط خودتون رو به زحمت می اندازید.خیلی ممنون استاد
آها ، یعنی با ساختنِ Attached Property ، میتونیم داخلِ این نوع پروپرتی (داخل Attached Property) ، مقدار سِت کنیم؟
باز این روش ، خیلی آسون تر از اون روشی هست که من پیدا کرده بودم (در پست قبل) . البته یه مشکل کوچیکش اینه که از کدهای سی شارپ هم استفاده میشه که حالا میشه نادیده اش گرفت .
روال عادی IsFocused طوریه که باید مشخص کنه که کدوم المنت Focus رو دریافت کرده، از اونجایی که Focus نمیتونه همزمان در چند جا باشه نمیشه که هم TextBox ئه Focus بگیره و هم اون المنتی که والد TextBox ئه است، حتی اگه والد امکان Focus گرفتن رو داشته باشه با این وجود Focus رو فرزند تصاحب کرده و والد Focus نداره.استاد ، تمپلیت ای که برای همین کنترل (DoubleUpDown) نوشتم و در این پست پیوست میکنم ، دو تا مشکل داره :
XML:<ToolKit:DoubleUpDown Name="numUpDown" Style="{StaticResource DoubleUpDownStyle}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20,20,0,0" Width="100" Height="36" Background="#FF5F5F5F" Value="10" BorderBrush="White" Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
اول اینکه وقتی در قسمت Trigger ئه اون تمپلیتِ DoubleUpDownStyle ، برای IsFocused ، اون تریگر را مینویسم ، زمانی که روی اون کنترل فوکوس انجام میشه ، اجرا نمیشه . اما اگه برای کنترل TextBox ای که داخلِ اون تمپلیت هست ، شرط بذارم ، اجرا میشه . مشکل تریگر در تمپلیت چیه که وقتی روی IsFocused ئه کنترل DoubleUpDown شرط میذارم ، اجرا نمیشه؟
XML:
<Grid>
<Grid.Resources>
<ControlTemplate TargetType="Button" x:Key="MyButtonTemplate">
<Grid>
<Button Width="100" Height="50" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Button Width="100" Height="50" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
</Grid>
</ControlTemplate>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Content" Value="Focused: True"/>
</Trigger>
<Trigger Property="IsFocused" Value="False">
<Setter Property="Content" Value="Focused: False"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Button Width="300" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" Template="{StaticResource MyButtonTemplate}"/>
</Grid>
مشکل از اینجا است که مطابق Style خودش پیش نرفته اید، وقتی میخواهید برای کنترلی Style بسازید اول باید بررسی کنید و ببینید خود Style پیشفرض اش چه مواردی داره، چه تنظیماتی داره. مثلا در Style دست ساز شما ممکنه رخداد های لازم به متد های مربوطه متصل نشده، Style خودش رو بررسی کنید تا ببینید چه مواردی رو از قلم انداخته اید، مثلا ممکنه EventSetter ای باشه که شما هم باید در Style داشته باشید.دوم اینکه وقتی که از همین کنترل DoubleUpDown شی بسازید (منظورم همین داخلxaml هست) ، اگه این تمپلیت را بکار نبرید ، زمان اجرای برنامه ، وقتی که داخل بخشِ TextBox ئه DoubleUpDown کلیک کنید (یا کلا فوکوسی روش انجام بشه) و بعد دکمه ی بالا (فِلِش بالا) یا دکمه ی پایین (فِلِشِ پایین) در کیبرد رو بزنید ، اعداد کم یا زیاد میشن اما وقتی این تمپلیت را بکار ببرید ، این قابلیت رو دیگه نداره .
مشکل این از کجاست؟