ورود

View Full Version : سوال: چگونگی حذف تمپلیت مربود به TextBox از طریق کد؟



alihassanabadi
چهارشنبه 15 آذر 1391, 14:39 عصر
سلام
دوستان کد زیر رو ببینید

<TextBox Name="txtNewField" Grid.Column="0" Width="150" Height="30" Margin="0,0,0,0" >
<TextBox.Template>
<ControlTemplate>
<Grid>
<Grid.ColumnDefinitions></Grid.ColumnDefinitions>
<TextBox Grid.Column="0"></TextBox>
<Button HorizontalAlignment="Right" Name="btnClose" Width="10" Click="imgRemove_Click" Height="10" Grid.Column="1">

</Button>
</Grid>
</ControlTemplate>
</TextBox.Template>
</TextBox>

حالا چطور میشه تمپلیت رو با کد نویسی پاک کرد
یا اگه این کار امکان پذیر نیست
آیا میشه باتون رو حذف کرد؟
با تشکر

مهدی فرزاد
چهارشنبه 15 آذر 1391, 18:56 عصر
سلام
شما اگر خاصیت Template رو برابر null قرار بدید کلا کنترلتون بدون تمپلت میشه !!! بهتره یک تمپلت دلخواه دیگه درست کنید و در موقع لزوم تمپلت کنترل رو تعویض کنید
برای مثال در کد زیر من یک تمپلت جدید بدون اون دکمه درست کردم

<Window.Resources>
<ControlTemplate x:Key="Template2" TargetType="{x:Type TextBox}">
<Grid>
<TextBox Grid.Column="0"/>
</Grid>
</ControlTemplate>
</Window.Resources>


بعد با کد زیر جای تمپلت ها رو عوض میکنم ( این تمپلت رو برای کنترل معرفی میکنم)

this.txtNewField.Template = FindResource("Template2") as ControlTemplate;


راه دوم :
برای اینکه اون دکمه حذف بشه این کد جواب شماست


((Button)this.txtNewField.Template.FindName("btnClose", this.txtNewField)).Visibility = System.Windows.Visibility.Collapsed;


پ و : در کد بالا btnClose صحیح است نه btnCl ose

alihassanabadi
پنج شنبه 16 آذر 1391, 09:04 صبح
سلام آقای فرزاد
با تشکر از پاسختون

شما اگر خاصیت Template رو برابر null قرار بدید کلا کنترلتون بدون تمپلت میشه !!!
بله این روش رو قبلش تست کردم و همه چیز میرفت

بهتره یک تمپلت دلخواه دیگه درست کنید و در موقع لزوم تمپلت کنترل رو تعویض کنید
سپاسگزار این روش جواب میده
و اما


برای اینکه اون دکمه حذف بشه این کد جواب شماست
1
2
((Button)this.txtNewField.Template.FindName("btnCl ose", this.txtNewField)).Visibility = System.Windows.Visibility.Collapsed;



این روش رو هم تست کرده بودم متاسفانه دکمه پیدا نمیشه
null برمیگردونه

Object reference not set to an instance of an object.

به هر حال سپاسگزارم از پاسختون

مهدی فرزاد
پنج شنبه 16 آذر 1391, 15:37 عصر
برای اینکه اون دکمه حذف بشه این کد جواب شماست
1
2
((Button)this.txtNewField.Template.FindName("btnCl ose", this.txtNewField)).Visibility = System.Windows.Visibility.Collapsed;

این روش رو هم تست کرده بودم متاسفانه دکمه پیدا نمیشه
null برمیگردونه
من دقیقا کد Xaml شما رو کپی کردم و روی اون تست کردم و جواب داد شاید در نوشتن نام کنترل اشتباه کردید دقت کنید اون فاصله درون اسم دکمه باید پاک بشه
btnCl ose

alihassanabadi
شنبه 18 آذر 1391, 11:18 صبح
سلام


من دقیقا کد Xaml شما رو کپی کردم و روی اون تست کردم و جواب داد شاید در نوشتن نام کنترل اشتباه کردید دقت کنید اون فاصله درون اسم دکمه باید پاک بشه
btnCl ose

بله دقیقا تست کردم خطای نوشتاری نداشتم البته من uc ساختم شاید دلیل دیگه ای داره

مهدی فرزاد
شنبه 18 آذر 1391, 12:39 عصر
بله در این کد که دادید مشکلی نداره اما اگر کد شما متفاوت باشه دیگه ممکنه این راه حل شما نباشه اگر صلاح میدونید کد کامل رو بدید و اگر روش اول مشکل رو حل کرده دیکه این رو نیاز ندارید

alihassanabadi
شنبه 18 آذر 1391, 13:29 عصر
سپاس از شما
راه حل اول جواب میده ولی کدش هم چیز خاصی نداره واسه اینکه اطمینان حاصل کنید باشه


public bool ButtonMode
{
set
{
if (!value)
{
// this.txtNewField.Template = FindResource("Template2") as ControlTemplate;
((Button)this.txtNewField.Template.FindName("btnClose", this.txtNewField)).Visibility = System.Windows.Visibility.Collapsed;
}
}
get
{
return (txtNewField.Template != null);
}
}

آقای فرزاد توجه کن که اینو تو یک یوزر کنترل ساختم ولی در هر صورت فرقی نداره
پ و : در کد بالا btnClose صحیح است نه btnCl ose
با تشکر.

Amir Oveisi
سه شنبه 21 آذر 1391, 12:05 عصر
اگر UserControll بسازید دیگه نمیتونید به المنت های داخل Template اش دسترسی داشته باشید. چون همه اون المنت ها میرن داخل ContentPresenter اون UserControl قرار میگیرند و میشن Content. یعنی دیگه به صورت جداگانه وجود خارجی ندارند.
برای رفع این مشکل به جای UserControl از CustomControl استفاده کنید. در CustomControl ها که از کلاس Control (یا مشتقات آن) ارث میبرند، برای طراحی UI از ControlTemplate استفاده میشه که باعث میشه بتونید با استفاده از روشی که آقای فرزاد فرمودند، به المنت های داخل Template دسترسی داشته باشید.
موفق باشید

alihassanabadi
سه شنبه 21 آذر 1391, 12:38 عصر
سلام فرمایشتون کاملا متین
ولی آیا اطمینان دارید که همه به contentPresent تبدیل میشن
ولی دیگه با یوزر کنترل درستش کردم و الان هم خیلی قشنگ جواب میده البته فعلا تو فاز طراحی ظاهرم
در هر صورت از پاسخ شما دو بزرگوار سپاسگذارم
بدرود

Amir Oveisi
سه شنبه 21 آذر 1391, 13:49 عصر
ولی آیا اطمینان دارید که همه به contentPresent تبدیل میشن
اگر از UserControl استفاده کرده باشید، قطعا همینطور خواهد بود. چون UserControl از نوع ContentControl ها به حساب میاد بنابراین زمانی که میخواید UI یک UserControl رو طراحی کنید و کنترل هایی رو داخل UserControl قرار میدید، در واقع دارید به Content اون UserControl مقدار میدید نه به Template اش. بنابراین همه اون کنترل ها داخل ContentPresenter خواند بود و از طریق Template قابل دسترسی نیستند.