PDA

View Full Version : سوال: آیا میتوان xaml پویا درست کرد؟(در زمان اجرا)



teardrop
یک شنبه 12 تیر 1390, 20:05 عصر
به نام خدا

آیا در زمان اجرای برنامه میتونم از کد xaml استفاده کنم.

مثلا:
من آیتم هایی در لیست باکس درست کردم، مثلا بهشون Border دادم رنگشو عوض کردم و...(در زمان طراحی)
ولی وقتی در زمان اجرا دستور اضافه کردن آیتم رو میدم آیتم معمولی می سازه.و من قصد دارم آیتم های جدیم هم مانند قبلی ها باشه.

لطفا راهنمایی کنید.

مهدی فرزاد
یک شنبه 12 تیر 1390, 21:30 عصر
سلام
اگر شما برای استایلی که برای آیتم تعریف کردید Key نگذارید این استایل دیفالت تمام آیتم ها خواهد شد

در غیر این صورت قبل از اضافه کردن هر آیتم باید اول استایل مورد نظر رو بهش معرفی کنید

teardrop
یک شنبه 12 تیر 1390, 21:54 عصر
سلام
اگر شما برای استایلی که برای آیتم تعریف کردید Key نگذارید این استایل دیفالت تمام آیتم ها خواهد شد

در غیر این صورت قبل از اضافه کردن هر آیتم باید اول استایل مورد نظر رو بهش معرفی کنید


<Window x:Class="UnderstandingRoutedEvent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown"> <ListBox Margin="10" Background="BurlyWood" MouseLeftButtonDown="Grid_MouseLeftButtonDown" Name="list1"> <ListBoxItem> <Border Margin="4" Padding="4" Background="Khaki" CornerRadius="6"> <TextBlock>Cats</TextBlock> </Border> </ListBoxItem> <ListBoxItem> <Border Margin="4" Padding="4" Background="Khaki" CornerRadius="6"> <TextBlock>Dogs</TextBlock> </Border> </ListBoxItem> </ListBox> </Grid> </Window>
کد بالا را ملاحظه کنید، در حالت عادی که در سی شارپ کد میزنی

list1.Items.Add("a");
آیتم ها بصورت معمولی اضافه خواهند شد ولی می خواهم در کد c# بتونم آیتم اضافه کنم ولی مثل استایل بالا آیتم ها اضافه شوند.
لطف کنید توضیح با نمونه مثالی در همین نوع کد ارائه نمایید.
متشکرم.

مهدی فرزاد
دوشنبه 13 تیر 1390, 01:28 صبح
سلام

شما دارید یک کار غیر اصولی رو انجام میدید
برای این کار شما باید برای ListBoxItem استایل تعریف کنید نه اینکه هر آیتم رو به این شکل ویرایش کنید

سعی کنید WPF رو اصولی کار کنید

این کد صحیح برای کار شما
فایل هم ضمیمه شد
اگر N آیتم هم اضافه کنید همه به یک شکل هستند
<Window.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border Margin="4"
Padding="4"
Background="Khaki"
CornerRadius="6">
<TextBlock Text="{TemplateBinding Content}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
</Window.Resources>
<Grid>
<ListBox
Margin="10,10,10,31"
Background="BurlyWood"
Name="list1">
<ListBoxItem Content="Dogs"/>
<ListBoxItem Content="Cats"/>
</ListBox>

teardrop
دوشنبه 13 تیر 1390, 19:45 عصر
سلام
باز یک سوال دیگر...
چطوری میشود هر آیتم(هر آیتم دلخواه)، استایل متفاوتی با دیگر آیتم ها داشته باشد.
مثلا هر وقت بخواهم یک آیتم اضافه کنم که همراه با یک ImageBox باشد، و بار دیگر بدونه ImageBox باشد.(باز هم در زمان اجرا)
از راهنمایی شما خوشحال میشوم.

مهدی فرزاد
سه شنبه 14 تیر 1390, 08:04 صبح
سلام

گر شما نیاز دارید هر آیتم Image متفاوت با آیتم دیگه داشته باشه راهش این نیست که برای هر آیتم یک استایل تعریف کنید بلکه کنترل Image توی استایل رو باید Bind کنید به Property که مسیر عکس مورد نظر رو بر میگردونه و با تغییر مقدار این Property در درون برنامه عکس هر آیتم هم عوض میشه

اما اگر روش تعریف استایل متفاوت برای هر آیتم رو بخواید باید برای هر ListBoxItem یک key تعریف کنید و بعد موقع Add کردن آیتم ها بگید که از کدوم استایل استفاده کنه

<Window.Resources>
<Style x:Key="ListBoxItem 1" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border Margin="4"
Padding="4"
Background="Khaki"
CornerRadius="6">
<TextBlock Text="{TemplateBinding Content}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
<Style x:Key="ListBoxItem 2" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border Margin="4"
Padding="4"
Background="#FF8CA9F0"
CornerRadius="6">
<TextBlock Text="{TemplateBinding Content}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
</Window.Resources>
<Grid>
<ListBox
Margin="10,10,10,31"
Background="BurlyWood"
Name="list1">
<ListBoxItem Content="Dogs" Style="{DynamicResource ListBoxItem 1}"/>
<ListBoxItem Content="Cats" Style="{DynamicResource ListBoxItem 1}"/>
</ListBox>
و
this.list1.Items.Add(new ListBoxItem(){Style = FindResource("ListBoxItem 2") as Style, Content ="a"});

ا