Laden...

ScaleTransform - Abstand gleich halten

Erstellt von OasisCritter vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.644 Views
O
OasisCritter Themenstarter:in
39 Beiträge seit 2011
vor 12 Jahren
ScaleTransform - Abstand gleich halten

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 += zoomFaktor3;[/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 += zoomFaktorMath.PI;[/C] probiert, hier das gleiche Problem.

Geht das nict irgendwie genauer?

Gruss Nezir

U
1.578 Beiträge seit 2009
vor 12 Jahren

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.

O
OasisCritter Themenstarter:in
39 Beiträge seit 2011
vor 12 Jahren

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.

U
1.578 Beiträge seit 2009
vor 12 Jahren

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?

O
OasisCritter Themenstarter:in
39 Beiträge seit 2011
vor 12 Jahren
<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

U
1.578 Beiträge seit 2009
vor 12 Jahren

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.

O
OasisCritter Themenstarter:in
39 Beiträge seit 2011
vor 12 Jahren

Ich arbeite doch mit RenderTransform:

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

ist im prozed. Code definiert...

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

das

        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.