Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ScaleTransform - Abstand gleich halten
OasisCritter
myCSharp.de - Member



Dabei seit:
Beiträge: 39

Themenstarter:

ScaleTransform - Abstand gleich halten

beantworten | zitieren | melden

Beim Zoom in eine Canvas mit ScaleTransform, versuche ich das Pixelverhältnis gleich zuhalten. Also ein grafisches Objekt das vor dem Zoom 30 Pixel lang war, soll nach dem Zoom ebenfalls 30 Pixel lang sein.

        public void Event_ZoomIn_Click(Object sender, RoutedEventArgs e)
        {
            
            sCanvTrans.ScaleX+=zoomFaktor;
            sCanvTrans.ScaleY+=zoomFaktor;

            pixelKorrektor += zoomFaktor*3;
            
            System.Console.WriteLine("Zoom-In :" + sCanvTrans.ScaleX.ToString());
        }

Mit [C]pixelKorrektor += zoomFaktor*3;[/C] hab ich mich der Sache schon relativ gut genähert, allerdings nicht gut genug, nach dem vierten Zoom beträgt die Abwechung schon 10Pixel. Habs auch schon mit [C]pixelKorrektor += zoomFaktor*Math.PI;[/C] probiert, hier das gleiche Problem.

Geht das nict irgendwie genauer?

Gruss Nezir
private Nachricht | Beiträge des Benutzers
userid14268
myCSharp.de - Member



Dabei seit:
Beiträge: 1.578

beantworten | zitieren | melden

Zitat
Also ein grafisches Objekt das vor dem Zoom 30 Pixel lang war, soll nach dem Zoom ebenfalls 30 Pixel lang sein.
Hä.
Durch den Zoom werden die Pixel doch mehr. Wenn die Pixel nicht mehr werden hast du auch kein Zoom.

PS. In WPF sind es auflösungsabhängige Einheiten, keine Pixel.
private Nachricht | Beiträge des Benutzers
OasisCritter
myCSharp.de - Member



Dabei seit:
Beiträge: 39

Themenstarter:

beantworten | zitieren | melden

Natürlich soll es optisch größer werden, ich habe eine Methode um die Länge zu vermessen:

 /**
         * MOUSE_DOWN
         * */
        private void MouseDownn(object sender, MouseButtonEventArgs e)
        {
            switch (e.ChangedButton)
            {
                case MouseButton.Left:
                    if (mess)
                    {
                        double tmpX = e.GetPosition(this).X - oldX;
                        double tmpY = e.GetPosition(this).Y - oldY;
                        abstand = (Math.Sqrt(tmpX * tmpX + tmpY * tmpY)/pixelKorrektor)/milliLength;
                        mess = false;
                        MessageBox.Show("Der Abstand beträgt: "+ Convert.ToInt64(abstand) + " Millimeter");
                        Console.WriteLine("Der Abstand beträgt: {0} Pixel(s)", abstand);
                    }
                    else
                    {
                        oldX = e.GetPosition(this).X;
                        oldY = e.GetPosition(this).Y;
                        mess = true;
                    }
                    break;
            }
        }

Beim Vermessen durch diese Methode soll das Verhältnis jedoch gleich bleiben.
private Nachricht | Beiträge des Benutzers
userid14268
myCSharp.de - Member



Dabei seit:
Beiträge: 1.578

beantworten | zitieren | melden

Wenn du ein Control mit dem ScaleTransform vergrößerst werden auch alle seine Childs direkt mit vergrößert und bleiben auf im korrekten verhältnis.

Wie sieht denn dein Xaml aus?
private Nachricht | Beiträge des Benutzers
OasisCritter
myCSharp.de - Member



Dabei seit:
Beiträge: 39

Themenstarter:

beantworten | zitieren | melden

<Window x:Class="WpfDrawGraphics.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  
        
    Title="Window1" Width="800" Height="600" >
    <!--    xmlns:y="clr-namespace:WpfDrawGraphics"
    xmlns="clr-namespace:System.Windows.Controls"
    xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib"
    xmlns="System"
    xmlns="System.Windows" -->
    <Grid>
        <DockPanel>
            <Menu DockPanel.Dock="Top" Name="mnuMenu">
                <MenuItem Header="_Datei">
                    <MenuItem Header="_Neu"  Click="Event_Data_New_Click"/>
                    <MenuItem Header="_Öffnen" Click="Event_Data_Open_Click"/>
                    <Separator />
                    <MenuItem Header="_Speichern" Click="Event_Data_Save_Click" />
                    <MenuItem Header="Speichern _unter ..." />
                    <Separator />
                    <MenuItem Header="_Senden an">
                        <MenuItem Header="_Mail" />
                        <MenuItem Header="_Desktop" />
                    </MenuItem>
                    <MenuItem Header="_Beenden" />
                </MenuItem>
                <MenuItem Header="_Bearbeiten" />
                <MenuItem Header="_Hilfe" />
            </Menu>
            <ToolBar DockPanel.Dock="Top">
                <Label Content="x1"></Label>
                <TextBox Name="lpx1" Width="30"></TextBox>
                <Label Content="y1"></Label>
                <TextBox Name="lpy1" Width="30"></TextBox>
                <Label Content="x2"></Label>
                <TextBox Name="lpx2" Width="30"></TextBox>
                <Label Content="y2"></Label>
                <TextBox Name="lpy2" Width="30"></TextBox>
                <Button Name="buttonDrawLine" Content="Draw Line!" Click="Event_DrawLine_Click"/>
                <Separator Width="2"></Separator>
                <Label Content="x1"></Label>
                <TextBox Name="c_px1" Width="30"></TextBox>
                <Label Content="y1"></Label>
                <TextBox Name="c_py1" Width="30"></TextBox>
                <Label Content="x2"></Label>
                <TextBox Name="c_px2" Width="30"></TextBox>
                <Label Content="y2"></Label>
                <TextBox Name="c_py2" Width="30"></TextBox>
                <ComboBox Name="c_box" Width="100">
                    <ComboBoxItem Content="Left"></ComboBoxItem>
                    <ComboBoxItem Content="Right"></ComboBoxItem>
                </ComboBox>
                <Button Name="buttonDrawCurve" Content="Draw Curve!" Click="Event_DrawCurve_Click"/>
                <Separator Width="2"></Separator>
                <Button  Name="undo" Content="Undo!" Click="Event_Undo_Click"></Button>
            </ToolBar>
            <ToolBar DockPanel.Dock="Top">
                <Button Name="bZoomIn" Content="Zoom-In" Click="Event_ZoomIn_Click"/>
                <Button Name="bZoomOut" Content="Zoom-Out" Click="Event_ZoomOut_Click"/>
            </ToolBar>
            <ScrollViewer Name="scrollViewer"   CanContentScroll="True"  Background="Transparent" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"  >
               <Canvas  Name="myCanvas"  Background="Silver"   MouseDown="MouseDownn"></Canvas>
                
            </ScrollViewer>
        </DockPanel>
        <!--  -->
     
        <!--    -->
    </Grid>
</Window>

Aber du verstehst mich nicht ganz, schau dir mal in meinem obigen Beitrag an wie ich einen Abstand messe. Nähmlich anhand der Pixel. Zoom ich jetzt aber rein und messe nun den vergrößerten Gegenstand, so soll der Abstandmesser mir den gleichen Abstand ausgeben.



Gruss Nezir
private Nachricht | Beiträge des Benutzers
userid14268
myCSharp.de - Member



Dabei seit:
Beiträge: 1.578

beantworten | zitieren | melden

Ich rate mal ins Blaue: Du willst die Maßeinheit mit vergößern sodass dies sich nicht ändert?

Wo ist in dein Xaml denn dein Transform Objekt?

Wenn du es nur Optisch vergößern willst ohne das sich das Objekt selber vergrößert musst du mit der RenderTransform arbeiten, nicht mit dem LayoutTransform.
private Nachricht | Beiträge des Benutzers
OasisCritter
myCSharp.de - Member



Dabei seit:
Beiträge: 39

Themenstarter:

beantworten | zitieren | melden

Ich arbeite doch mit RenderTransform:

sCanvTrans = new ScaleTransform();
myCanvas.RenderTransform = sCanvTrans;

ist im prozed. Code definiert...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von OasisCritter am .
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1.688

beantworten | zitieren | melden

Hallo,

das
Zitat von OasisCritter

        public void Event_ZoomIn_Click(Object sender, RoutedEventArgs e)
        {
            
            sCanvTrans.ScaleX+=zoomFaktor;
            sCanvTrans.ScaleY+=zoomFaktor;

            pixelKorrektor += zoomFaktor*3;
            
            System.Console.WriteLine("Zoom-In :" + sCanvTrans.ScaleX.ToString());
        }

sieht doch ziemlich komisch aus. "zoomFaktor" ist hier ja eher ein Summand. Und "pixelKorrektor" sollte doch wohl in der später gezeigten Verwendung dem Skalierungsfaktor entsprechen.
private Nachricht | Beiträge des Benutzers