/ / Transfere peça de xaml para o recurso - silverlight, templates

Transferir peça de xaml para recurso - silverlight, modelos

Eu tenho 8 colunas e cada uma delas tem o mesmo datacontext.

<!-- COLUMN: PREVIEW MESSAGE -->
<data:DataGridTemplateColumn x:Name="PreviewColumn" CanUserSort="True"
SortMemberPath="Preview" Width="*">
<data:DataGridTemplateColumn.CellTemplate>

<DataTemplate>
<TextBlock Text="{Binding Preview}"
FontWeight="{Binding IsBold, Converter={StaticResource cnvFontWeight}}"
Foreground="{Binding IsOverdueMessage, Converter={StaticResource cnvOverdue}}"
VerticalAlignment="Center"
Margin="5,0,5,0">
<telerik:RadContextMenu.ContextMenu>
<telerik:RadContextMenu Opened="inboxContextMenu_Opened" ItemClick="inboxContextMenu_ItemClick">
<telerik:RadMenuItem Header="Forward message" Loaded="ForwardMessageMenuItem_Loaded"/>
</telerik:RadContextMenu>
</telerik:RadContextMenu.ContextMenu>
</TextBlock>
</DataTemplate>

</data:DataGridTemplateColumn.CellTemplate>

</data:DataGridTemplateColumn>

Qual é a maneira mais prática de tornar este menu contextual reutilizável? Está em todas as colunas idênticas. Eu não tenho muita experiência no silverlight. Estou usando o silverlight 4.

Respostas:

1 para resposta № 1

Primeiro eu pensei, você poderia criar um específicoestilo para o TextBlock e, em seguida, coloque o ContextMenu dentro do estilo. No entanto, como o TextBlock não é herdado do ContentControl, você não pode simplesmente fazer isso.

O que você pode fazer é usar um Rótulo em vez do TextBlock. Depois de incluir o namespace SDK, você teria algo assim,

xmlns: sdk = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"

    <sdk:Label Content="{Binding Preview}"
FontWeight="{Binding IsBold, Converter={StaticResource cnvFontWeight}}"
Foreground="{Binding IsOverdueMessage, Converter={StaticResource cnvOverdue}}"
VerticalAlignment="Center"
Margin="5,0,5,0"
Style="{StaticResource LabelWithContextMenuStyle}"/>

Você pode ver que eu especifiquei um estilo para este controle Label.

Este estilo é basicamente o estilo padrão do Label com um ContextMenu adicional dentro do seu ContentControl.

    <Style x:Key="LabelWithContextMenuStyle" TargetType="sdk:Label">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="sdk:Label">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="Disabled"/>
</VisualStateGroup>
<VisualStateGroup x:Name="ValidationStates">
<VisualState x:Name="Valid"/>
<VisualState x:Name="Invalid">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0:0:1.5" Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentControl">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<SolidColorBrush Color="Red"/>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="RequiredStates">
<VisualState x:Name="NotRequired"/>
<VisualState x:Name="Required">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="FontWeight" Storyboard.TargetName="ContentControl">
<DiscreteObjectKeyFrame KeyTime="0" Value="SemiBold"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="2" Padding="{TemplateBinding Padding}">
<ContentControl x:Name="ContentControl" Cursor="{TemplateBinding Cursor}" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsTabStop="False" VerticalAlignment="{TemplateBinding VerticalAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" Margin="131,106,0,0">
<telerik:RadContextMenu.ContextMenu>
<telerik:RadContextMenu Opened="RadContextMenu_Opened" ItemClick="RadContextMenu_ItemClick">
<telerik:RadMenuItem Loaded="RadMenuItem_Loaded"/>
</telerik:RadContextMenu>
</telerik:RadContextMenu.ContextMenu>
</ContentControl>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

É isso. Eu espero que isso ajude. :)