View Full Version : اضافه کردن یک کنترل به expander
hsoft_project
چهارشنبه 22 آذر 1391, 12:52 عصر
سلام دوستان یکی راهنمایی کنه که به expander چطور یک کنترل مثل لیست باکس رو اضافه کنم من هر چی لیست باکس رو داخل تگ expender میذارم نمایشش نمیده چه باید کرد؟
alihassanabadi
چهارشنبه 22 آذر 1391, 13:24 عصر
سلام
حتما یه اشتباهی وجود داره
<Expander Foreground="White">
<Expander.Header>
expander header
</Expander.Header>
<Expander.Content>
<ListBox>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
</ListBox>
</Expander.Content>
</Expander>
hsoft_project
چهارشنبه 22 آذر 1391, 17:09 عصر
با تشکر از شما دوست عزیز مشکل اول حل شد ولی حالا با این روشی که شما گفتید یک کنترل میشه اضافه کرد الان من یک چک باکس زیرش اضافه میکنم با مشکل مواجه میشم و خطا تولید میشه
alihassanabadi
چهارشنبه 22 آذر 1391, 17:51 عصر
خواهش میکنم
مشکلت از اینه که شما باید کنترلهاتو داخل یک کانتاینر container بزاری مثل SatckPanel,Grid,DockPanel و...
مثل
<Expander Foreground="White" >
<Expander.Header>
expander header
</Expander.Header>
<Expander.Content>
<StackPanel Orientation="Horizontal">
<ListBox>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
</ListBox>
<CheckBox Content="ch1"></CheckBox>
<CheckBox Content="ch2"></CheckBox>
<CheckBox Content="ch3"></CheckBox>
<CheckBox Content="ch4"></CheckBox>
</StackPanel>
</Expander.Content>
</Expander>
hsoft_project
چهارشنبه 22 آذر 1391, 18:15 عصر
سوال بعدی که تقاضای کمک دارم اینه که من این expander ها رو میتونم جایی قرار بدم که وقتی یکیشو میبندم اون یکیا که زیرشن باهاش جم بشن بیان بالا
مثل ویندوز xp که اولین expander رو میبندی بقیه زیرش جمع میشن میان بالاتر
alihassanabadi
چهارشنبه 22 آذر 1391, 18:29 عصر
صد البته
جهت تست
<Expander Foreground="White" Collapsed="Expander_Collapsed">
<Expander.Header>
expander header
</Expander.Header>
<Expander.Content>
<StackPanel Name="exParent" Orientation="Vertical">
<Expander>
<ListBox>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
</ListBox>
</Expander>
<Expander>
<StackPanel>
<CheckBox Content="ch1"></CheckBox>
<CheckBox Content="ch2"></CheckBox>
<CheckBox Content="ch3"></CheckBox>
<CheckBox Content="ch4"></CheckBox>
</StackPanel>
</Expander>
</StackPanel>
</Expander.Content>
</Expander>
حالا میایم تمام expander هایی که تو expParent هستند رو پیدا میکنیم و با جمع شدن واد فرزندهایی که از نوع expander هستند رو جمع میکنیم
private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
foreach (Control c in exParent.Children)
{
if (c.GetType() == typeof(Expander))
{
Expander chb = (Expander)c;
chb.IsExpanded = false;
}
}
}
دوست عزیز این فقط یکی از روشهاست و چون من سریع جواب دادم با این روش رفتم
روش های دیگه ای هم هست مثل triggerها
alihassanabadi
چهارشنبه 22 آذر 1391, 18:48 عصر
دوست عزیز فکر کنم سوالتون بد متوجه شدم و پاسخ دادم
فکر کردم میگید Expander هایی که داخل یک Expander دیگه هستند جمع بشن که پاسخش اونه
البته اگه Expander ها هم جدا از هم باشند میشه این کارو کرد اگه روش بالا کافیه که چه بهتر ولی جوابش اینه
هر چند کد C# هیچ تغییری نمیکنه فقط چیدمان تغییر میکنه میشه این
<Grid>
<StackPanel Name="exParent" Orientation="Vertical">
<Expander Name="expan1" Foreground="White" Collapsed="Expander_Collapsed">
<Expander.Header>
expander header
</Expander.Header>
<Expander.Content>
<Button Name="btn"></Button>
</Expander.Content>
</Expander>
<Expander Name="expan2">
<ListBox>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>first</ListBoxItem>
</ListBox>
</Expander>
<Expander Name="expan3">
<StackPanel>
<CheckBox Content="ch1"></CheckBox>
<CheckBox Content="ch2"></CheckBox>
<CheckBox Content="ch3"></CheckBox>
<CheckBox Content="ch4"></CheckBox>
</StackPanel>
</Expander>
</StackPanel>
</Grid>
hsoft_project
چهارشنبه 22 آذر 1391, 18:52 عصر
با سپاس از شما استاد عزیز ولی من مثل اینکه منظورم رو بد رسوندم. فرض کنید م 2 expander داریم و اینها زیر هم قرار دارن و هر دو expander باز هستن ویا expanded هستند حالا اولی رو من collapsed میکنم و یا میبندم و جمع میشه ولی دومی که زیرش هست باز هست و نمیخوام بسته بشه ولی position دومی تغییر کنه و به زیر اون یکی expander اولی بره و فاصله ش رو باهاش مثل قبل کنه من دوتا عکس ضمیمه میکنم در اولی expander ها هر دو باز هستند و فصله ها از پایین بهم چسبیده هستند ولی در تصویر دوم expander بالایی بسته شده ولی زیری فصلش خیلی زیاد شده من میخوام بیاد بجسبه زیرش
معذرت خواهی بنده رو بپذیرید بخاطره اذیت کردن شما دوست عزیز
9654496545
hsoft_project
چهارشنبه 22 آذر 1391, 18:56 عصر
بنده از stack panel در این شکلها استفاده کردم ولی به زیر اون بر نمیگرده باید کد C# هم بنویسم یا خود stack panel این کارو میکنه؟
alihassanabadi
پنج شنبه 23 آذر 1391, 09:31 صبح
سلام
شما اگه eXPANDER ها رو تو استک پنل گذاشته باشید در صورتی که اولی جمع بشه دومی هم میره بالاتر این کار به صورت اتوماتیک انجام میشه و هیچ مشکلی هم نداره
پست شماره 7 دقیقا جواب شماست منتهی دیگه کدهای c# رو ننویس
من همین الان تست زدم خیلی قشنگ کار میکنه مطمین باشد یه جای کارتون گیر داره
ولی فکر کنم مشکل از اینه که شما EXPAnDER دوم رو با اون کنترلهای تغییر نام کاربری که سمت راست expander دوم هستند تو یک کانتاینرن
اگه میخوای کد طراحی رو بزار تا چک کنیم
hsoft_project
پنج شنبه 23 آذر 1391, 11:00 صبح
با تشکر از شما دوست عزیز مشکل حل شد من height کنترل expander رو روی auto نذاشته بودم. فقط یه کمک دیگه به بنده بکنبد. من یک انیمیشن برای زمان extended شدن expander گذاشتم که میخوام این انیمیشن موقع باز شدن expander تا مقدار height بره نه یک عدد ثابت مثل
<EasingThicknessKeyFrame KeyTime="0:0:1" Value="0,0,0,Height"/>
نه این که در گزینه اخر به جای height عدد ثابت بذارم الان من مثله کده بالا رو میذارم از height خطا میگیره میگه مثل زیر عدد ثابت بذار
<EasingThicknessKeyFrame KeyTime="0:0:1" Value="0,0,0,300"/>
alihassanabadi
پنج شنبه 23 آذر 1391, 11:52 صبح
آره مشکل قبلی دقیقا از ارتفاع بود که باید auto باشه
این نمونه باز کردن محتویات Expander به صورت انیمیشن
<StackPanel>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="Expander.Expanded" SourceName="expander">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation From="0" To="1" Duration="0:0:0.25" Storyboard.TargetName="gg" Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform .ScaleY)"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</StackPanel.Triggers>
<Expander x:Name="expander" Header="Expander">
<GroupBox x:Name="gg">
<GroupBox.Content>
<StackPanel>
<Button>b1</Button>
<Button>b1</Button>
<Button>b1</Button>
<Button>b1</Button>
</StackPanel>
</GroupBox.Content>
<GroupBox.LayoutTransform>
<ScaleTransform ScaleX="1" ScaleY="0"/>
</GroupBox.LayoutTransform>
</GroupBox>
</Expander>
</StackPanel>
اینجا تو expander گروپ باکس گذاشتم
شما میتونید هر کانتاینر دیگه ای بزارید
منتها این قسمت رو باید براش تعریف کنی
<ScaleTransform ScaleX="1" ScaleY="0"/>
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.