2009-03-21 18 views
2

Ich arbeite mit dem WPF DataGrid aus dem WPFToolkit und ich habe Probleme mit dem Versuch, das gesamte Datagrid zu zoomen. Mein anfänglicher Gedanke war, dass es wirklich einfach sein würde und ich würde einfach eine Skalierungstransformation auf das Gitter anwenden und die ScaleX-, ScaleY-Eigenschaften animieren, wenn der Benutzer auf eine Schaltfläche klickte. Dies funktionierte jedoch nicht, da die Bildlaufleiste vergrößert wurde, wodurch sie größer wurde. Ich brauche feste Header und feste Spalten auf dem Datagrid, so dass ich nicht einfach einen Scrollviewer außerhalb des Datagrids verwenden kann, um mit dem Scrollen umzugehen. Die zweite Sache, die ich versuchte, war, nur die Schriftgröße im Raster zu skalieren, aber das scheiterte, weil die Spalten beim Schrumpfen der Schriftgröße auf der ursprünglichen Breite bleiben und nicht schrumpfen.WPF Datagrid Zoom Problem

Endlich dachte ich, ich hätte es funktioniert, indem ich den folgenden Code verwendet habe, der in den View-Tree für das Datagrid geht und eine Scale-Transformation zum Scroll Content Presenter hinzufügt. (Auch in diesem Code nicht gezeigt, wende ich eine Transformation auf die visuelle Struktur für die Header in der gleichen Weise, so dass es auch skaliert). Ich dachte, das funktionierte großartig, bis ich das horizontale Scrollen nach dem Zoomen getestet habe. (Das vertikale Scrollen funktioniert einwandfrei.) Vor dem Zoomen ist das horizontale Scrollen in Ordnung, aber nach dem Zoomen, wenn ich horzonital scrolle, flippt das Display aus. Es ist schwer zu sagen, was genau es tut, aber es sieht irgendwie so aus, als ob der Inhalt, der von der linken Seite des Bildschirms scrollt, "umklappt" und auf der linken Seite zurückkommt. Vielleicht ist es nur alles auf der linken Seite zerschlagen. Hat jemand irgendwelche Ideen, wie ich das zum funktionieren bringen kann, hoffentlich ohne mein ganzes Datagrid hinauszuwerfen, das ansonsten schon ganz gut funktioniert.

ScrollContentPresenter sp = (ScrollContentPresenter) 
VisualTreeHelper.GetChild(
VisualTreeHelper.GetChild(
VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(dgMatrix,  0), 0), 0),2); 
ScaleTransform st = new ScaleTransform(1, 1); 
sp.LayoutTransform = st; 
DoubleAnimation a = new DoubleAnimation(); 
a.By = 1.5; 
a.AutoReverse = false; 
a.Duration = new Duration(TimeSpan.Parse("0:0:0.25")); 
st.BeginAnimation(ScaleTransform.ScaleXProperty, a); 
st.BeginAnimation(ScaleTransform.ScaleYProperty, a); 
+0

ich eine Lösung machbar gefunden habe und es veröffentlichen, wenn ich eine bekommen Chance. –

+0

Wäre schön, die Lösung zu sehen ... Ich stoße auf das gleiche Problem. – KrisTrip

Antwort

0

Ich habe eine Lösung gefunden. Sie wissen nicht, ob dies die gleiche Art und Weise ist, dass Sie es getan haben oder nicht:

<toolkit:DataGrid.CellStyle> 
    <Style TargetType="{x:Type toolkit:DataGridCell}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type toolkit:DataGridCell}"> 
        <ContentPresenter> 
         <ContentPresenter.LayoutTransform> 
          <ScaleTransform ScaleX="{Binding Path=Value, ElementName=ZoomFactor}" 
              ScaleY="{Binding Path=Value, ElementName=ZoomFactor}" /> 
         </ContentPresenter.LayoutTransform> 
        </ContentPresenter> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</toolkit:DataGrid.CellStyle> 

Wo Zoomfactor ist ein Slider:

<Slider x:Name="ZoomFactor" 
     Value="1" 
     Minimum=".25" 
     Maximum="5" 
     Width="180" Margin="0,0,5,0"/> 
+0

Das einzige Problem, das ich noch nicht erkannt habe, ist, dass die Größe der Spalten nach dem Zoomen nicht mehr geändert wird, nachdem Sie den Zoom/Zoom-Effekt wieder deaktiviert haben. – KrisTrip