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
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.
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.
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?
<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
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.
Ich arbeite doch mit RenderTransform:
sCanvTrans = new ScaleTransform();
myCanvas.RenderTransform = sCanvTrans;
ist im prozed. Code definiert...
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.