Передать кусок xaml на ресурс - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть 8 столбцов, и у каждого из них одинаковый текстовый текст.

<!-- 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>

Какой самый практичный способ сделать это контекстное меню повторно используемым?Это в каждом столбце идентично.У меня нет большого опыта в серебряном свете.Я использую Silverlight 4.

1 Ответ

1 голос
/ 03 октября 2011

Сначала я подумал, что вы можете создать определенный стиль для TextBlock, а затем поместить ContextMenu в этот стиль.Однако, поскольку TextBlock не наследуется от ContentControl, вы не можете просто сделать это.

Теперь вы можете использовать Label вместо TextBlock.После включения пространства имен sdk у вас будет что-то вроде этого:

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}"/>

Вы можете видеть, что я определил стиль для этой меткиcontrol.

Этот стиль в основном является стилем по умолчанию для Label с дополнительным ContextMenu, находящимся внутри 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>

Вот и все. Надеюсь, это поможет.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...