ورود

View Full Version : سوال: در مورد نوشتن code-behind در WPF (اضافه و حذف TabItem)



orca13
شنبه 23 اردیبهشت 1391, 13:32 عصر
سلام.
دوستان فرض کنید که من برای tab control یه تب طراحی کردم، حالا یه دکمه روی صفحه گذاشتم، میخوام اون رو ک زدم یه تب به تب کنترل اضافه بشه، چکار باید بکنم؟
ممنون

<TabItem Name="tabItem" IsSelected="True" Width="150" MinWidth="70" MaxWidth="150">
<TabItem.Header>
<Grid Height="30" Margin="0">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<TextBlock FontSize="11" Grid.Column="0" Margin="3,8,0,0">
<TextBlock.Text>New tab</TextBlock.Text>
</TextBlock>
<Button Name="btnCloseTab" Grid.Column="1" Style="{StaticResource ButtonStyle1}">
<Button.Width>20</Button.Width>
<Button.Height>20</Button.Height>
<Button.Content>
<Image Source="./img/x.png" Width="8px" Height="8px"/>
</Button.Content>
</Button>
</Grid>
</TabItem.Header>
</TabItem>

کد بالا رو جهت تب نوشتم.

orca13
یک شنبه 24 اردیبهشت 1391, 09:40 صبح
دوستان کسی نیست یه راهنمایی بکنه؟

مهدی فرزاد
دوشنبه 25 اردیبهشت 1391, 09:37 صبح
سلام
این روش کار شما صحیح نیست
شما باید برای TabItem تمپلت تعریف کنید و این چیدمان رو کنترل ها رو درون اون انجام بدید من نمونه شما رو به این شکل ویرایش کردم
(البته این یک استایل کامل نیست و فقط یک نمونه هست طبق نمونه شما)

<Window.Resources>
<ControlTemplate x:Key="TabItemStyle" TargetType="{x:Type TabItem}">
<Grid Height="Auto" Width="Auto">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="MoseOver">
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.7"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled"/>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected"/>
<VisualState x:Name="Selected">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="SelectedColor">
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="Backgrond" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Height="Auto" CornerRadius="4,4,0,0" Background="{TemplateBinding Background}" d:LayoutOverrides="Width, Height"/>
<Border x:Name="MoseOver" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Height="Auto" CornerRadius="4,4,0,0" Grid.ColumnSpan="1" d:LayoutOverrides="Width, Height" Opacity="0">
<Border.Background>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFFF6900" Offset="0"/>
<GradientStop Color="#FFFF8000" Offset="0.5"/>
<GradientStop Color="#FFF36F00" Offset="0.506"/>
<GradientStop Color="DarkOrange" Offset="0.996"/>
</LinearGradientBrush>
</Border.Background>
</Border>
<Border x:Name="SelectedColor" BorderThickness="1" Height="Auto" CornerRadius="4,4,0,0" Grid.ColumnSpan="1" d:LayoutOverrides="Width, Height" Background="#FFF38600" Opacity="0" BorderBrush="{TemplateBinding BorderBrush}"/>
<Grid Height="Auto" Margin="6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="HeaderText" FontSize="11" Grid.Column="0" Margin="5,0" Text="{TemplateBinding Header}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Button x:Name="btnCloseTab" Width="Auto" Height="Auto" Grid.Column="1" Click="btnCloseTab_Click" Tag="{TemplateBinding Name}" Content="×" FontSize="12" FontFamily="Tahoma" Cursor="Hand">
<Button.Template>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</ControlTemplate>
</Button.Template>
</Button>
</Grid>
</Grid>
</ControlTemplate>
</Window.Resources>

حالا یک متد برای اضافه نمودن تپ درست می کنید ( من این متد رو بر اساس خواصی که شما برای تب آیتم گذاشته بودید تنظیم کردم

int tabItamIndex;
void AddTabItem()
{
TabItem t = new TabItem();
tabItamIndex += 1;
t.Template = FindResource("TabItemStyle") as ControlTemplate;
t.Header = "NewTabItem" + tabItamIndex;
t.Name = "tab" + tabItamIndex;
t.MaxWidth = 150;
t.Width = 150;
t.MinWidth = 70;

this.tabcontrol.Items.Add(t);
}


بعد برای اضافه کردن تپ کافیه این رو فراخونی کنید
private void button1_Click(object sender, RoutedEventArgs e)
{
AddTabItem();
}

برای پاک کردن تب هم کد زیر رو برای اون دکمه ای که توی استایل بود نوشتم

private void btnCloseTab_Click(object sender, RoutedEventArgs e)
{

foreach (TabItem item in tabcontrol.Items)
{
if (item.Name == ((sender as Button).Tag))
{
tabcontrol.Items.Remove(item);
tabItamIndex -= 1;
return;
}
}


}

دقت کنید برای دکمه توی استایل این کد نوشته شده


<Button x:Name="btnCloseTab" Width="Auto" Height="Auto" Grid.Column="1" Click="btnCloseTab_Click" Tag="{TemplateBinding Tag}"

توی این کد اول ما اونت btnCloseTab_Click رو ایجاد کردیم و بعد خاصیت Tag اون رو بایند کردیم به Name تب آیتم با این کد "{Tag="{TemplateBinding Nameچرا؟؟؟!!

برای اینکه ما در موقع اضافه کردن تب به مقداری برابر t.Name="tab" + tabItamIndex دادیم . در نتیجه tag دکمه هم همین مقدار رو بگیره چراا؟؟
tabItamIndex یک شمارنده هست از نوع Int که در موقع اضافه شدن تب یکی به اون اضافه و در موقع کم شدن تب یکی از اون کم میشه پس با کد بالا tab Item ها نام تکراری نخواهند داشت
حالا این در زمان حذف تب کاربرد داره برای اینکه بفهمیم کدم تب باید حذف شه به این شکل که تمام tab Item های توی تب کنترل جستجو میشه و هر کدم اسمش برابر Tag فرستنده (sender) که طبیعتا از نوع دکمه هست ، بود حذف میشه ( دکمه فشرده شده sender هست و Tag اون هم باند شد به Name تب آیتم)
اینم ضمیمه
دوستان دیگه خواهشا به پست ها پاسخ بدن باور کنید من وقت نمیکنم بیام و تمام مسائل رو اینجوری تشریح کنم
الان میدونم 100 سئوال دیگه در ادامه این مطلب پرسیده میشه
لطفا همکاری کنید