1

Je suis sans doute sur quelque chose qui sera évident quand je vois la solution, mais pour l'instant ...Silverlight 3.0 curseur personnalisé dans le graphique

Je tente d'utiliser un curseur personnalisé dans la zone de graphique d'une boîte à outils graphique. J'ai créé un ControlTemplate pour le graphique et une grille pour contenir les curseurs. Je montre/cache les curseurs, et tente de déplacer la grille contenant, en utilisant divers événements de la souris. Le curseur est affiché aux heures correctes, mais je n'arrive pas à l'amener à la bonne position.

Voici le ControlTemplate (les couleurs funky sont les tentatives juste pour confirmer ce que les différents éléments du modèle concernent):

 <dataVisTK:Title Content="{TemplateBinding Title}" 
         Style="{TemplateBinding TitleStyle}"/> 

     <Grid Grid.Row="1"> 

      <!-- Remove the Legend --> 
      <!--<dataVisTK:Legend 
     x:Name="Legend" 
     Title="{TemplateBinding LegendTitle}" 
     Style="{TemplateBinding LegendStyle}" 
     Grid.Column="1"/>--> 


      <chartingPrimitivesTK:EdgePanel x:Name="ChartArea" 
              Background="#EDAEAE" 
              Style="{TemplateBinding ChartAreaStyle}" 
              Grid.Column="0"> 
       <Grid Canvas.ZIndex="-1" 
         Background="#2008AE" 
         Style="{TemplateBinding PlotAreaStyle}"> 
       </Grid> 
       <Border Canvas.ZIndex="1" 
         BorderBrush="#FF250010" 
         BorderThickness="3" /> 

       <Grid x:Name="gridHandCursors" 
         Canvas.ZIndex="5" 
         Width="32" Height="32" 
         Visibility="Collapsed"> 
        <Image x:Name="cursorGrab" Width="32" 
          Source="Resources/grab.png" /> 
        <Image x:Name="cursorGrabbing" Width="32" 
          Source="Resources/grabbing.png" 
          Visibility="Collapsed"/> 
       </Grid> 

      </chartingPrimitivesTK:EdgePanel> 
     </Grid>        
    </Grid> 
</Border> 

et Voici les événements souris (en particulier, le MouseMove):

void TimelineChart_Loaded(object sender, RoutedEventArgs e) 
{ 
    chartTimeline.UpdateLayout(); 

    List<FrameworkElement> chartChildren = GetLogicalChildrenBreadthFirst(chartTimeline).ToList(); 

    mChartArea = 
     chartChildren.Where(element => element.Name.Equals("ChartArea")).FirstOrDefault() as Panel; 

    if (mChartArea != null) 
    { 
     grabCursor = chartChildren.Where(element => element.Name.Equals("cursorGrab")).FirstOrDefault() as Image; 
     grabbingCursor = chartChildren.Where(element => element.Name.Equals("cursorGrabbing")).FirstOrDefault() as Image; 

     mGridHandCursors = 
      chartChildren.Where(element => element.Name.Equals("gridHandCursors")).FirstOrDefault() as Grid; 

     mChartArea.Cursor = Cursors.None; 
     mChartArea.MouseMove += new MouseEventHandler(mChartArea_MouseMove); 
     mChartArea.MouseLeftButtonDown += new MouseButtonEventHandler(mChartArea_MouseLeftButtonDown); 
     mChartArea.MouseLeftButtonUp += new MouseButtonEventHandler(mChartArea_MouseLeftButtonUp); 
     if (mGridHandCursors != null) 
     { 
      mChartArea.MouseEnter += (s, e2) => 
       mGridHandCursors.Visibility = Visibility.Visible; 
      mChartArea.MouseLeave += (s, e2) => 
       mGridHandCursors.Visibility = Visibility.Collapsed; 
     } 
    } 
} 

void mChartArea_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{    
    if (grabCursor != null) 
     grabCursor.Visibility = Visibility.Visible; 
    if (grabbingCursor != null) 
     grabbingCursor.Visibility = Visibility.Collapsed; 
} 

void mChartArea_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (grabCursor != null) 
     grabCursor.Visibility = Visibility.Collapsed; 
    if (grabbingCursor != null) 
     grabbingCursor.Visibility = Visibility.Visible; 
} 

void mChartArea_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (mGridHandCursors != null) 
    { 
     Point pt = e.GetPosition(null); 
     mGridHandCursors.SetValue(Canvas.LeftProperty, pt.X); 
     mGridHandCursors.SetValue(Canvas.TopProperty, pt.Y); 
    } 
} 

Toute aide passée ce roadblock serait grandement appréciée!

Merci, WTS

Répondre

0

je une chose qui fonctionne (qui l'entoure avec une toile), mais je serais ouvert à d'autres solutions de rechange moins de code-odeur.

<Canvas Canvas.ZIndex="5"> 
    <Grid x:Name="gridHandCursors" 
      Width="32" Height="32" 
      Visibility="Collapsed"> 
     <Image x:Name="cursorGrab" Width="32" 
       Source="Resources/grab.png" /> 
     <Image x:Name="cursorGrabbing" Width="32" 
       Source="Resources/grabbing.png" 
       Visibility="Collapsed"/> 
    </Grid> 
</Canvas> 
Questions connexes