2009-10-01 9 views
2

J'ai un contrôle personnalisé contenant un chemin qui a une info-bulle sur gabarit. Je veux être en mesure d'obtenir une référence à une grille dans le modèle lors de l'exécution afin que je puisse modifier ses enfants en fonction de l'utilisation.Comment modifier le modèle Silverlight lors de l'exécution?

Je pensais pouvoir utiliser GetTemplateChild pour obtenir une référence à la grille dans le modèle à partir de la méthode OnApplyTemplate du contrôle, mais cette méthode ne se déclenche pas.

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    _tooltipDetails = (Grid)GetTemplateChild("TooltipDetailsGrid"); 
} 

Sinon, comment pourrais-je être en mesure de faire cela?

Voici le code XAML du contrôle utilisateur.

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="MiX.AssetManagement.UI.Timeline.Silverlight.TimelineBarRibbonItem" 
    FontSize="9.333" Foreground="White" mc:Ignorable="d"> 
    <UserControl.Resources> 
     <ControlTemplate x:Key="ToolTipControlTemplateTimelineView" TargetType="ToolTip"> 
      <StackPanel Orientation="Horizontal" Margin="16,0,0,0"> 
       <VisualStateManager.VisualStateGroups> 
        <VisualStateGroup x:Name="OpenStates"> 
         <VisualState x:Name="Closed"/> 
         <VisualState x:Name="Open"/> 
        </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <Border CornerRadius="4"> 
        <Border.Background> 
         <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
          <GradientStop Color="#7F000000" Offset="0"/> 
          <GradientStop Color="#B2000000" Offset="1"/> 
         </LinearGradientBrush> 
        </Border.Background> 
        <Grid Margin="4"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition/> 
          <ColumnDefinition/> 
         </Grid.ColumnDefinitions> 
         <Border x:Name="Info" Height="16" Width="16" BorderThickness="2" CornerRadius="8" HorizontalAlignment="Left" VerticalAlignment="Top"> 
          <Border.BorderBrush> 
           <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
            <GradientStop Color="White" Offset="0"/> 
            <GradientStop Color="#7FFFFFFF" Offset="1"/> 
           </LinearGradientBrush> 
          </Border.BorderBrush> 
          <Path Fill="White" Stretch="Fill" Margin="5.229,2.089,5.035,2.82" RenderTransformOrigin="0.5,0.5" UseLayoutRounding="False" Data="M0.77471197,5.0623446 L2.4198356,5.0623446 L2.4198356,10.18 L0.77471197,10.18 z M0.72914064,3.0891075 L2.4654069,3.0891075 L2.4654069,4.3332038 L0.72914064,4.3332038 z"> 
           <Path.RenderTransform> 
            <TransformGroup> 
             <ScaleTransform/> 
             <SkewTransform/> 
             <RotateTransform/> 
             <TranslateTransform/> 
            </TransformGroup> 
           </Path.RenderTransform> 
          </Path> 
         </Border> 
         <ContentPresenter d:LayoutOverrides="Width, Height" Margin="20,0,0,0"/> 
         <Grid Grid.Column="1" x:Name="TooltipDetailsGrid"> 
          <TextBlock Text="Tooltip in a Grid"/> 
         </Grid> 
        </Grid> 
       </Border> 
      </StackPanel> 
     </ControlTemplate> 
    </UserControl.Resources> 

    <Path x:Name="RibbonItem" Cursor="Hand"> 
     <Path.Fill> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FF66CC33"/> 
       <GradientStop Color="#FF339900" Offset="1"/> 
      </LinearGradientBrush> 
     </Path.Fill> 
     <ToolTipService.ToolTip> 
      <ToolTip x:Name="RibbonItemTooltip" Content="" Foreground="#FFFFFFFF" FontSize="9.333" Placement="Mouse" Template="{StaticResource ToolTipControlTemplateTimelineView}"/> 
     </ToolTipService.ToolTip> 
     <Path.Data> 
      <GeometryGroup x:Name="RibbonItemGeometryGroup"> 
       <RectangleGeometry x:Name="RibbonItemBackground" /> 
      </GeometryGroup> 
     </Path.Data> 
    </Path> 
</UserControl> 
+0

Ce post est une reformulation de http://stackoverflow.com/questions/1497842/overriding-method-of-an-element-within-a-xaml-usercontrol avec le code source ajouté. Basé sur la réponse unique à ce que le OnApplyTemplate ne peut pas tirer car l'élément Path ne peut pas être modélisé. –

+0

Je ne vois pas un contrôle "personnalisé" ici, juste un "usercontrol"? – AnthonyWJones

+0

Merci d'avoir signalé mon abus de terminologie Anthony. Cela ne m'aide pas vraiment à résoudre mon problème. –

Répondre

0

J'ai résolu ce d'une manière légèrement différente. Plutôt que de modifier le modèle lors de l'exécution, j'ai créé une instance du modèle pour chaque cas d'utilisation. Je peux ensuite appliquer le modèle correct lorsque je crée l'instance et les éléments dans le modèle de liaison à la classe de contrôle pour remplir l'info-bulle avec les valeurs appropriées.

Ceci est probablement une meilleure approche car la structure des info-bulles est maintenant clairement visible dans le code XAML, plutôt que d'être cachée dans le code.

1

Vous devez gérer le code dans la méthode OnApplyTemplate des classes d'info-bulles. Voici mon coup de couteau non testé à ce que vous devez faire: -

Hériter de infobulle et remplacer la méthode OnApplyTemplate dans cette nouvelle classe: -

public MyToolTip : ToolTip 
{ 
    public override void OnApplyTemplate() 
    { 
     //Perhaps to stuff 
     base.OnApplyTemplate(); 
     //Perhaps to other stuff 
    } 
} 

Dans vos ressources vous maintenant définir le TargetType-local:MyToolTip et assurer votre espace de nom d'assembly est placé avec l'alias local dans l'élément de contrôle utilisateur.

maintenant dans votre Xaml: -

<ToolTipService.ToolTip> 
      <local:MyToolTip x:Name="RibbonItemTooltip" Content="" Foreground="#FFFFFFFF" FontSize="9.333" Placement="Mouse" Template="{StaticResource ToolTipControlTemplateTimelineView}"/> 
    </ToolTipService.ToolTip> 
Questions connexes