none
Rotieren eines DocumentViewer wenn er als Superklasse einer eigenen Klasse dient RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine eigene Klasse "Document" welche "DocumentViewer" als Superklasse hat.
    Also "class Document : DocumentViewer".

    Wenn ich nun versuche mit
                this.RenderTransformOrigin = new Point(0.5, 0.5);
                this.RenderTransform = new RotateTransform(this.angle);
    zu drehen, dann dreht er mir den Viewer oben links bei 0.5, 0.5 und nicht wie normalerweise um den Mittelpunkt.

    LayoutTransform möchte ich nicht nutzen, da das Layout vom drehen unbeeinflusst sein soll.

    Nutze ich den DocumentViewer alleine, ohne ihn als Superklasse meiner Klasse Document zu verwenden und drehe ihn, dann dreht er mit obigem Code genau auf der Stelle wie es eigentlich auch sein müsste.
    Gleiches Problem hatte ich schoneinmal, als ich einer eigenen Klasse als "Child" ein Image gegeben hatte.
    Mit
    this.Child.RenderTransform = new RotateTransform(this.angle);
    war das auch kein Problem.

    Dies möchte ich so aber nicht machen, da es deutlich einfacher ist DocumentViewer als Superklasse zu verwenden.

    Gibt es eine Möglichkeit der Superklasse zu sagen, dass sie sich drehen soll an Stelle der Document Klasse?
    Oder muss ich in meiner Klasse erst die Eigenschaften für RenderTransform etc. implementieren?

    Danke für die Hilfe!
    Mittwoch, 3. März 2010 18:18

Alle Antworten

  • Hmm... ich weiß nicht, ob ich mich nicht verständlich genug ausgedrückt habe.
    Wenn unklar ist, was ich meine, dann bitte einfach nachfragen, weil das recht wichtig ist.

    Ich versuche es nochmal etwas anders auszudrücken.

    Wenn ich ein DocumentViewer nutze und diesen um den Mittelpunkt drehen möchte, so verwende ich:
                this.RenderTransformOrigin = new Point(0.5, 0.5);
                this.RenderTransform = new RotateTransform(this.angle);
    Das funktioniert.

    Wenn ich jetzt aber eine eigene Klasse namens Document nehme die DocumentViewer als Oberklasse hat ("class Document : DocumentViewer") und den gleichen obigen Code ausführe, so funktionert dieses drehen nur an den 90°, 180°, 270° und 360° Punkten wie gewünscht (in 45° Schritten).
    Bei allen Zwischenschritten wird nicht um den Mittelpunkt rotiert.

    Eigentlich dachte ich, dass meine Klasse die gleichen Eigenschaften wie DocumentViewer hat, wenn ich diesen als Oberklasse verwende. Oder sehe ich das falsch?
    Donnerstag, 4. März 2010 22:59
  • Hallo Tyralion,

    Kannst Du den Code zeigen (XAML Datei und CodeBehind)?

    Danke und Grüße,

    Robert

    Donnerstag, 11. März 2010 08:58
    Moderator
  • Hallo Robert,

    in der XAML-Datei steht nicht sonderlich viel drin, da die Documents (später jedenfalls) dynamisch hinzugefügt werden, wenn sie gebraucht werden.

    Aber hier der Code:

    <Window x:Class="VisualizationFramework.Visualization"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MTVisualizationFramework (WPF)" Height="768" Width="1024">
        <Grid Name="root"
              MouseWheel="docs_MouseWheel"
              MouseRightButtonDown="docs_MouseRightButtonDown"
              MouseRightButtonUp="root_MouseRightButtonUp"
              MouseLeftButtonDown="docs_MouseLeftButtonDown"
              MouseLeftButtonUp="root_MouseLeftButtonUp"
              MouseMove="docs_MouseMove"
              PreviewMouseLeftButtonDown="docs_MouseLeftButtonDown"
              PreviewMouseLeftButtonUp="root_MouseRightButtonUp"
              PreviewMouseWheel="docs_MouseWheel"
              PreviewMouseMove="docs_MouseMove"
              PreviewMouseRightButtonDown="docs_MouseRightButtonDown">
            <Image Name="background" Stretch="Fill" />
            <Canvas Name="stacks"></Canvas>
        </Grid>
        <Window.Resources>
            <Style x:Key="DocumentViewer" TargetType="{x:Type DocumentViewer}">
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DocumentViewer">
                            <Border BorderThickness="{TemplateBinding BorderThickness}" 
                                    BorderBrush="{TemplateBinding BorderBrush}" Focusable="False">
                                <Grid KeyboardNavigation.TabNavigation="Local">
                                    <Grid.Background>
                                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                            <GradientBrush.GradientStops>
                                                <GradientStopCollection>
                                                    <GradientStop Color="#FFF" Offset="0.0"/>
                                                    <GradientStop Color="#EEE" Offset="1.0"/>
                                                </GradientStopCollection>
                                            </GradientBrush.GradientStops>
                                        </LinearGradientBrush>
                                    </Grid.Background>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
                                    <ScrollViewer Grid.Row="1" CanContentScroll="true" HorizontalScrollBarVisibility="Auto" x:Name="PART_ContentHost" IsTabStop="true"/>
                                </Grid>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
    </Window>
    


    Und der relevante Code-behind-Teil ist folgender:
            public Visualization()
            {
    
                mInstance = this;
                InitializeComponent();
                try
                {
    
                    XpsDocument xps1 = new XpsDocument("XPS_test1.xps", FileAccess.Read);
    
                    double x = 0;
                    int idDoc = -1;
    
                    //Finds the DocumentViewer style that contains no menu bar to apply to
                    Style style = (Style)FindResource("DocumentViewer");
    
                    Document doc = new Document(++idDoc, xps1, true);
                    DocumentViewer viewer = new DocumentViewer();
                    doc.Style = style;
                    doc.Document = xps1.GetFixedDocumentSequence();
                    doc.SetPos(x + 7.5, x + 17.5);
                    doc.SetOrigin();
                    stacks.Children.Add(doc);
                }
                catch (Exception x)
                {
                    Console.Out.WriteLine(x);
                }
                VFWService.InitApp();
            }
    
            /* Testing Rotating */
            private void docs_MouseWheel(object sender, MouseWheelEventArgs e)
            {
                Point p = e.GetPosition(stacks);
                HandleMTMouseWheel(p.X, p.Y);
            }
    
            private void HandleMTMouseWheel(double x, double y)
            {
                new HandleMTRotate(stacks, 45).HandleMTEvent(x, y);
            }
    Mit der Klasse HandleMTRotate die eigentlich nur das korrekte Document anhand der Koordinaten findet und darauf dann MTRotate() aufruft.



    Dann hier die Klasse Document (Nur die relevanten Teile):
    class Document : DocumentViewer
    {
            /* Hier sind noch mehr Felder */
    
            private double angle;
    
    
            public void MTRotate(int id, double angle)
            {
                this.angle += angle;
                if (this.angle >= 360) this.angle = this.angle - 360;
    
                this.RenderTransformOrigin = new Point(0.5, 0.5);
                //this.RenderTransformOrigin = origin;
    
                //LayoutTransform = new RotateTransform(this.angle, origin.X, origin.Y);
                RenderTransform = new RotateTransform(this.angle);
             }
    
       /* Weitere Funktionen */
    
    }
    Wobei ich hier entweder LayoutTransform od. auch RenderTransform ausprobiert hatte, beides jedoch nicht so funktioniert wie erhofft....

    Allerdings habe ich festgestellt, dass das ganze in einem separaten Projekt mit nur relevantem Code funktioniert.
    Kann es sein, dass es ein Problem gibt, wenn ein weiters UIElement an der selben Stelle von dem zu drehenden Element sitzt (Auch wenn es nicht sichtbar ist), wenn man LayoutTransform oder RenderTranform benutzt?
    Das wäre jedenfalls das Einzige, was mir auf Anhieb zum Unterschied zw. den beiden Projekten einfallen würde...

    Zu dem 'nicht sichtbaren' UIElement: Das Element ist eine weitere eigene Klasse Stack, die quasi einen Stapel von darauf liegenden Documents definiert. Diese UIElement liegt immer genau da, wo auch die anderen Documents liegen.
    Samstag, 13. März 2010 11:44