View Full Version : سوال: تنظیم Width یه شکل داخل قالب کامپوننت، با استفاده از مقدار Width همون کامپوننت
emad4000
دوشنبه 20 شهریور 1391, 22:14 عصر
سلام
من یه دکمه طراحی کردم به شکل زیر که کدش رو هم نوشتم
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Grid>
<Button Width="150" Height="30">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid>
<Rectangle Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Fill="Red" RadiusX="15" RadiusY="15" />
<Rectangle Width="130" Fill="{TemplateBinding Background}" RadiusX="15" RadiusY="15" />
<TextBlock Text="{TemplateBinding Content}" />
</Grid>
</ControlTemplate>
</Button.Template>
Emad
</Button>
</Grid>
</Page>
http://up.vatandownload.com/images/wzg7rvtol0kwzars5emi.png
همونطور که می بینید می خوام مستطیل دکمه اصلی حدود 20 پیکسل از مستطیل قرمز کوچیک تر باشه که قرمزه از دو طرف بزنه بیرون
می بینید که توی کدم خاصیت Width مستطیل دوم رو دستی گذاشتم 130
در حالیکه می خوام مقدار دستی نباشه و یه مقدار پویا باشه به اندازه 20 پیکسل کوچیک تر از Width کنترل Button
اگه این کدها رو بنویسم خطا میده
Width="{TemplateBinding Width} - 20"
یا
Width="{TemplateBinding Width - 20}"
می خواستم بدونم روش درستش چیه ؟
homan1374
سه شنبه 21 شهریور 1391, 00:12 صبح
درستش استفاده از margin هست....
emad4000
سه شنبه 21 شهریور 1391, 08:42 صبح
درستش استفاده از margin هست....
ممنون، ولی بازم درست نشد :گریه:
<Rectangle Fill="{TemplateBinding Background}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" RadiusX="15" RadiusY="15" Margin="10,0,10,0" />
http://up.vatandownload.com/images/1ufax2wsag41iv51t4gj.png
کلاً هم برام سوال شده که اگه بخوام مقداری رو که مستطیل از کامپوننتش دریافت میکنه تغییر بدم چجوری میشه؟!؟
homan1374
سه شنبه 21 شهریور 1391, 09:56 صبح
<Button Width="150" Margin="176,140,176,116">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid >
<Border Margin="2"
Padding="8"
CornerRadius="20"
BorderBrush="Red"
BorderThickness="1"
Background="Red">
<Rectangle Width="130" Fill="{TemplateBinding Background}" RadiusX="15" RadiusY="15" />
</Border>
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Button.Template>
Emad
</Button>
emad4000
چهارشنبه 22 شهریور 1391, 01:05 صبح
خیلی ممنون از جوابتون، ولی بازم این هم چیزی که من می خوام نیست
کد شما این شکل رو میده
http://up.vatandownload.com/images/79i70chwv9sahapm7c6.png
در حالیکه من این شکل رو می خوام
http://up.vatandownload.com/images/g25l2axdx74vzigoea.png
خودم براش این کد رو نوشتم، ولی کد من اشکال داره
<Button Width="150" Height="30">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid>
<Rectangle Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Fill="Red" RadiusX="15" RadiusY="15" />
<Rectangle Width="130" Fill="{TemplateBinding Background}" RadiusX="15" RadiusY="15" />
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Button.Template>
Emad
</Button>
توی کد من هربار که بخوام سایز دکمه عوض بشه، هم باید Width خود کامپوننت رو عوض کنم و هم Width مستطیل (Rectangle) دوم رو.
دقیقا سوال من اینه، چطوری می تونم با استفاده از خاصیت Width کامپوننت، یعنی رشته "{TemplateBinding Width}" ، یه عدد کوچکتر بدست بیارم، یعنی 20 واحد کمترش
مثلاً تو کد طول کامپوننت 150 هست، من می خوام عدد 130 رو ازش بدست بیارم، حالا مثلا اگر طول کامپوننت شد 190، طول Rectangle من بشه 170
مهدی فرزاد
چهارشنبه 22 شهریور 1391, 02:32 صبح
سلام
شما باید از Margin استفاده کنید و طول و عرض رو برابر Auto قرار بدید وAlignment های کنترل مورد نظر هم Stretch باشند
emad4000
چهارشنبه 22 شهریور 1391, 06:35 صبح
سلام
شما باید از Margin استفاده کنید و طول و عرض رو برابر Auto قرار بدید وAlignment های کنترل مورد نظر هم Stretch باشند
ممنون، ولی میشه کد بنویسین، من متوجه منظورتون نشدم
مهدی فرزاد
چهارشنبه 22 شهریور 1391, 12:50 عصر
<Button Width="150" Height="30" Content="Emad">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid>
<Rectangle Fill="Red" RadiusX="15" RadiusY="15" />
<Rectangle Fill="{TemplateBinding Background}" RadiusX="15" RadiusY="15" Margin="10,0" />
<ContentPresenter Height="Auto" Width="Auto" Margin="0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
mahboube
پنج شنبه 23 شهریور 1391, 12:06 عصر
کلاً هم برام سوال شده که اگه بخوام مقداری رو که مستطیل از کامپوننتش دریافت میکنه تغییر بدم چجوری میشه؟!؟
برای این کار میتونید Convertor بنویسید.
public class WidthCovnvertor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
return ((float)value) - 20;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
بعد هم به اینصورت بایند کنید.:
Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource WidthCovnvertor}}"
Amir Oveisi
یک شنبه 26 شهریور 1391, 16:26 عصر
تا زمانی که با استفاده از خود XAML میتونید یک کار رو انجام بدید، سراغ Converter نرید. همونطور که اشاره شد با استفاده از Margin این کار رو میشه انجام داد. استفاده از Converter برای این کار مثل کشتن یه پشه با R.P.G می مونه ;)
موفق باشید
mahboube
دوشنبه 27 شهریور 1391, 16:14 عصر
تا زمانی که با استفاده از خود XAML میتونید یک کار رو انجام بدید، سراغ Converter نرید. همونطور که اشاره شد با استفاده از Margin این کار رو میشه انجام داد. استفاده از Converter برای این کار مثل کشتن یه پشه با R.P.G می مونه ;)
موفق باشید
من نگفتم Convertor استفاده کنن،اگه دقت کنین من جواب اون قسمتی رو نوشنم که تو نقل قول گذاشتم جناب اویسی!در ضمن مقدار margin همیشه ثابته،اگر بخوان این فاصله بسته به width باشه فایده نداره!
پ.ن:اون نقل قول:
نوشته شده توسط emad4000
کلاً هم برام سوال شده که اگه بخوام مقداری رو که مستطیل از کامپوننتش دریافت میکنه تغییر بدم چجوری میشه؟!؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.