Laden...

Forenbeiträge von OasisCritter Ingesamt 39 Beiträge

06.05.2012 - 17:27 Uhr

Ja macht irgendwie kein Sinn. Aber wenn ich mehrere y-Arrays übergebe mit jeweils einem Punkt, erhalte ich ein Bild. Bleibt noch die Frage zu klären wie ich die x-Werte übergeben kann? Das ist sehr wichtig, da er die x-Achse nach einem mir unbekannten Prinzip skaliert. Ich muss aber unbedingt jedem y-Wert auch seinen x-Wert zuordnen können bzw. anders herum. Kennt sich da einer aus?

Viele Grüße

04.05.2012 - 16:56 Uhr

Hi,

ich habe Schwierigkeiten eine simple Chart anzuzeigen. Ich gehe wie folgt vor:

                System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
                series1.ChartArea = "ChartArea1";
                series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
                series1.Legend = "Legend1";
                series1.Name = "Series1";
                series1.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
                series1.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
                series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;


                series1.BorderColor = System.Drawing.SystemColors.GrayText;
                series1.BorderDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash;
                series1.Color = Color.Black;
                series1.Enabled = true;

                double[] y= new double[15];
                 y[0]=5;
                 y[1]=4;
                 y[2]=8;
                 y[3] = 9;
                 y[4] = 10;
                 y[5] = 50;
                 y[6] = 43;
                 y[7] = 82;
                 y[8] = 93;
                 y[9] = 24;
                 y[10] = 5;
                 y[11] = 4;
                 y[12] = 8;
                 y[13] = 900;
                 y[14] = 2;


                 series1.Points.Add(y);

                 this.chart1.Series.Add(series1);

Eigentlich möchte ich ein einfaches Diagramm wie das eines Börsenkurses darstellen, mit x,y-Werten welche als Double gegeben sind. Allerdings sehe ich nur die Möglichkeit die y-Werte anzugeben und selbst das funktioniert nicht bzw. wird nicht angezeigt. Ich sehe folgendes: (siehe Anhang)

11.07.2011 - 15:39 Uhr

Hallo,

gibt es eine Möglichkeit Diagramme in C# über MS-Excel o.Ä. zu zeichnen ohne das der Benutzer MS-Excel installiert hat?
Ich will keine externen Bibliotheken einbinden...

Das hier funktioniert wohl nur wenn der Benutzer auch Excel hat:
KB302084: Microsoft Excel mit Microsoft Visual C# .NET automatisieren

danke

06.07.2011 - 13:51 Uhr

Hallo,

ich versuche gerade eine ProgressBar in einer eigenen WinForm zu erstellen.

Hier mein Ansatz:

 public partial class RIM_ProgressBar : Form
    {

        Thread _thread;
        int _val;

        public int Value
        {
            set {this._val=value; }
            get { return this._val; }
        }

        public RIM_ProgressBar(int min, int max, int actual)
        {
            InitializeComponent();
            progressBar1.Minimum = min;
            progressBar1.Maximum = max;
            progressBar1.Value = actual;
            _val = actual;
        }

        private void RIM_ProgressBar_Load(object sender, EventArgs e)
        {
            _thread = new Thread(new ThreadStart(load));
            _thread.Start();
        }

        public void load()
        {
            progressBar1.Value = _val;
            statusStrip1.Text = progressBar1.Value.ToString() + "%omplete";
           // Thread.Sleep(10);
        }

        public void changeValue(int val)
        {
            this._val = val;
        }

        
       
    }

So ruf ich das auf:

RIM_ProgressBar rProgBar = new RIM_ProgressBar(0, 100, 0);
            rProgBar.Show();
            

            for (int i = 0; i < 100; i++)
            {
                rProgBar.Value = i;
                Thread.Sleep(10);
            }

Ja ich kenne dieses Thema:
[FAQ] Warum blockiert mein GUI?

Hilft mir aber irgendwie nicht weiter...

Gruss Nezir

20.06.2011 - 16:14 Uhr

Hallo,

ich würde gerne ein Lizenzschutzsystem entwickeln, habe schon einige Ideen, würde mich aber vorher gerne über den aktuellen Stand der Dinge informeren.
Weiß da jemand etwas genaueres?
Ich will keine kostenpflichtigen Bibliotheken benutzen und es sollten keine Hilfsmittel (Dongles) nötig sein.
Allgemeine Ansätze oder Ideen wären wünschenswert.

Gruss OC

30.05.2011 - 16:48 Uhr

Ist es denn nicht möglich einen vernünftigen Halbkreis zu zeichnen?

30.05.2011 - 16:06 Uhr

Also mein Ziel ist es eine benutzerdefinierte Canvas zu erstellen, bei der das hinzufügen von DrawingVisuals als auch über Canvas.Children.Add() möglich macht.

public class CustomCanvas : Canvas
    {

        private int count;

        private VisualCollection visuals;



        public CustomCanvas() 
        {

            visuals = new VisualCollection(this);

            this.Loaded += CustomCanvas_Loaded;

        }

        public void AddVisual(DrawingVisual dw)
        {
            this.visuals.Add(dw);
        }

        void CustomCanvas_Loaded(object sender, RoutedEventArgs e)
        {

          //  this.Draw();

        }



        protected override Int32 VisualChildrenCount
        {

            get { return visuals.Count; }

        }



        protected override Visual GetVisualChild(Int32 index)
        {

            if (index < 0 || index > visuals.Count)
            {

                throw new ArgumentOutOfRangeException("index");

            }



            return visuals[index];

        }



    }

Dadurch wird das hinzufügen von DrawingVisuals möglich, allerdings werden Grafische Objekte durch Canvas.Children.Add(...) nicht mehr gezeichnet...
Wieso nicht?

Gruss Nezir

30.05.2011 - 12:25 Uhr

Kannst du mir sagen, inwieweit oder von wo aus sich der x-Radius und y-Radius auf das Objekt auswirken. Es wird nirgendswo richtig erklärt. Sagen wir, auf meiner Zeichnung oben ist p1 (links unten) und p2 (rechts oben), wie und von wo aus wirken jetzt die beiden Radien?

Gruss Nezir

26.05.2011 - 13:55 Uhr

Gibt es eine Möglichkeit Kurven genau zu zeichnen? Anhand von beliebig gegebenen Punkten und einem Radius? Bislang habe ich das mit Path+ BezierSegment gemacht, dass ist aber zu ungenau...

Gruss Nezir

19.05.2011 - 14:24 Uhr

Danke hat funktioniert 😉

19.05.2011 - 13:17 Uhr

Kann man beim iterieren einer UIElementCollection die einzelnen UIElemente auf den Typ prüfen? Also obs eine Line, Path etc. ist?

Gruss Nezir

16.05.2011 - 14:43 Uhr

verwendetes Datenbanksystem: <XML>

Angenommen ich hab folgende XML:

 <?xml version="1.0" encoding="utf-8" ?> 
- <GraphStore>
- <ptu_Line>
  <name>MyXML-Line</name> 
  <x1>50</x1> 
  <y1>50</y1> 
  <x2>100</x2> 
  <y2>100</y2> 
  <color>Black</color> 
  <stroke-thikness>2</stroke-thikness> 
  </ptu_Line>
- <ptu_Curve>
  <name>MyXML-Curve</name> 
  <x1>50</x1> 
  <y1>50</y1> 
  <x2>50</x2> 
  <y2>100</y2> 
  <x3>100</x3> 
  <y3>100</y3> 
  <color>Black</color> 
  <stroke-thikness>2</stroke-thikness> 
  </ptu_Curve>
  </GraphStore>

Ich unterscheide im aktuellen Sichtfeld nur zwischen "ptu_Line" und "ptu_Curve", auf die Unterelemente, wie z.B name, x1,y1... will ich manuell zugreiffen.
Arbeite zum ersten mal mit XML und finde keine Methode, welche von einem Element zum nächsten wechselt. Also ich will von name zu x1 zu y1..etc.
Ich schätze Attribute sind sowas hier <ptu_Line name="Attr1" x1="Attr2">, das will ich aber vermeiden.

Gruss Nezir

12.05.2011 - 14:27 Uhr

Hey,

wie der Titel schon sagt, lautet die Frage ob man eine gewöhnliche WPF-Anwendung in eine WPF-Benutzersteuerelementenbibliothek umwandeln kann und diese anschließend noch weiter bearbeiten kann?

Gruss Nezir

09.05.2011 - 13:35 Uhr

Ich arbeite doch mit RenderTransform:

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

ist im prozed. Code definiert...

09.05.2011 - 11:15 Uhr
<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

05.05.2011 - 13:58 Uhr

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.

05.05.2011 - 11:42 Uhr

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

02.05.2011 - 17:03 Uhr

Etwa so:

<Window x:Class="WpfDrawGraphics.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:y="clr-namespace:WpfDrawGraphics"
    xmlns="clr-namespace:System.Windows.Controls"
    xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib"
    xmlns="System"
    xmlns="System.Windows" 

Geht trotzdem nicht...

02.05.2011 - 16:35 Uhr

Hab das runtergeladen und auch die dazu benötigten 4 anderen .CS-Files. Ins Projekt geladen, find die aber nicht in der Verweisliste.

Wenn ich ein Namespace für mein eigenes Projekt anlege:

xmlns:y="clr-namespace:WpfDrawGraphics"

dann kann ich von dort aus nur meine xaml-Datei aufrufen, nicht jedoch die cs-Files

02.05.2011 - 15:37 Uhr

Wo lad ich das Projekt runter?
Jaja, ich würd mich auch aufregen wenns für mich selbstverständlich ist und jemand mit der Frage ankommt.
Aber ich bin neu in .Net neu in C# und neu in WPF.

Danke

02.05.2011 - 14:48 Uhr
  1. Wie st der Verweis für ZoomableCanvas, der findet das bei mir nicht.
  2. Ist es besser die Canvas in eine Viewbox bzw. ZoomPanel zu packen?
02.05.2011 - 12:03 Uhr

Genau, ich will in das Canvas reinzoomen, und dementsprechend sollen sich die ScrollBars anpassen:

sCanvTrans = new ScaleTransform();
            myCanvas.RenderTransform = sCanvTrans;
            myCanvas.LayoutTransform = sCanvTrans;
 public void Event_ZoomIn_Click(Object sender, RoutedEventArgs e)
        {
            System.Console.WriteLine("Zoom-In :" + sCanvTrans.ScaleX.ToString());
            
            sCanvTrans.ScaleX+=zoomFaktor;
            sCanvTrans.ScaleY+=zoomFaktor;
            milliLength += zoomFaktor;

        }
<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"  Background="Transparent" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"  >
                <Canvas Name="myCanvas"  Background="Silver"   MouseDown="MouseDownn"></Canvas>
            </ScrollViewer>

Es wird in die Canvas gezoomt.
Aber die Scrollbars passen sich nicht an, geschweige denn aktivieren sie sich...

28.04.2011 - 15:12 Uhr

Ich will eine zoombaren Canvas mit einem Scrollviewer austatten, der Anh#ngig vom Zoomfaktor, den Scroolviewer anpasst. Allerdings find ich im Scrollviewer irgendwie nur Variablen, die nicht verändert werden können...

 <ScrollViewer Name="scrollViewer"  Background="Transparent" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"  >
                <Canvas Name="myCanvas"  Background="Silver"  MouseLeftButtonDown="Event_ZoomIn_Click" MouseRightButtonDown="Event_ZoomOut_Click"></Canvas>
            </ScrollViewer>
    public void Event_ZoomIn_Click(Object sender, RoutedEventArgs e)
        {
            System.Console.WriteLine("Zoom-In :" + sCanvTrans.ScaleX.ToString());
            
            ++sCanvTrans.ScaleX;
            ++sCanvTrans.ScaleY;

            scrollViewer.ViewportHeight++;  // ???
            scrollViewer.VerticalOffset++;  // ???
            scrollViewer.ActualHeight++;    // ???
            
        }

Gruss Nezir

28.04.2011 - 14:03 Uhr

Danke, hat funktioniert...

28.04.2011 - 13:47 Uhr

Kann ich irgendwie ein MousebuttonEventhandler auf einem Canvas platzieren?
So meine Lösung:

<Canvas Name="myCanvas" MouseLeftButtonDown="Event_MouseDown_Click"></Canvas>
 public void Event_MouseDown_Click(Object sender, MouseButtonEventArgs mBeArgs)
        {
           
                System.Console.WriteLine("MouseButton-Left");
                
        
        }

Aber es tut sich nichts, wieso?

Gruss Nezir

21.04.2011 - 23:15 Uhr

Danke für Antwort, hat mir sehr geholfen 😄

Anmerkung: Die Flächen "Oben" und "Unten" des Würfels sind nicht gesetzt aber das versuch ich selber...

Gruss Nezir

21.04.2011 - 15:26 Uhr

Hallo,

ich versuche gerade ein Würfel zu zeichnen in einem WPF-Window.

<Window x:Class="Cube3D.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Viewport3D Name="viewport1">
            
            <!--Camera-->
            <Viewport3D.Camera>
                <PerspectiveCamera LookDirection="-6 -5 -4" Position="6 5 4"></PerspectiveCamera>
            </Viewport3D.Camera>
            <!--Light-->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight Direction="-1 -1 -1"></DirectionalLight>
                </ModelVisual3D.Content>
             </ModelVisual3D>
            
            <!--GeometryModel-->
             <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D
                                Positions="-1 1 0 1 1 0 1 -1 0 -1 -1 0 -1 1 1 1 1 1 1 -1 1 -1 -1 1"
                                TriangleIndices="3 2 1 1 4 3 3 2 7 2 7 6 4 1 8 1 8 5 8 3 4 3 8 7 8 5 6 8 7 6"
                                Normals="1 1 0 0 1 0 1 1 0 0 0 1 1 1 1"
                                > 
                            </MeshGeometry3D>
                        </GeometryModel3D.Geometry>
                        <!--Brush-->
                        <GeometryModel3D.Material>
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <SolidColorBrush Color="blue"></SolidColorBrush>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
    </Grid>
</Window>

Das Resultat lässt aber zu wünschen übrig, ich verstehe nicht, wenn man z.B. ein Triangle zwischen den Punkten (1 2 3) zeichnen will, worin der unterschied besteht ob man das jetzt so macht (1 2 3), (2, 1, 3), oder (3,2,1)? Denn beim verändern der Werte ändert sich auch das Bild?!?
Ich bekomme aufjedenfall keinen Würfel, nur wieso?

Gruss Nezir

18.04.2011 - 14:45 Uhr

Ok, kannst du mir kurz erklären, wie ich folgendes Beispiel zum laufen bringe. Hab schon alles versucht:

  • beide Projekte geöffnet
  • beide Projekte geöffnet + QuadraticSurface als Verweis bei Visual3D

geht alles nicht...

18.04.2011 - 13:44 Uhr

Hey,

ich versuche gerade in WPF mit 3D-Objekten zu arbeiten. Bei folgendem Beispielcode:

<GeometryModel3D>
  <GeometryModel3D.Geometry>
          <MeshGeometry3D 
              Positions="-1 -1 0  1 -1 0  -1 1 0  1 1 0"
              Normals="0 0 1  0 0 1  0 0 1  0 0 1"
              TextureCoordinates="0 1  1 1  0 0  1 0   "
              TriangleIndices="0 1 2  1 3 2" />
      </GeometryModel3D.Geometry>
      <GeometryModel3D.Material>
          <DiffuseMaterial>
              <DiffuseMaterial.Brush>
                  <SolidColorBrush Color="Cyan" Opacity="0.3"/>
              </DiffuseMaterial.Brush>
          </DiffuseMaterial>
      </GeometryModel3D.Material>
  <!-- Translate the plane. -->
      <GeometryModel3D.Transform>
          <TranslateTransform3D
            OffsetX="2" OffsetY="0" OffsetZ="-1"   >
          </TranslateTransform3D>
      </GeometryModel3D.Transform>
  </GeometryModel3D>


seh ich aber nur das hier:

Gruss Nezir

18.04.2011 - 12:50 Uhr

Ok, habe jetzt das grundlegende Gerüst:

DrawingImage dImage = new DrawingImage();
            GeometryDrawing geoDraw = new GeometryDrawing();
            GeometryGroup geoGroup = new GeometryGroup();
            //Pen
            geoDraw.Pen = new Pen(Brushes.Red,3);
            // Line
            LineGeometry lGeo = new LineGeometry(new Point(0, 0), new Point(100, 100));

            geoGroup.Children.Add(lGeo);
            geoDraw.Geometry = geoGroup;
            dImage.Drawing = geoDraw;
            myImage.Source = dImage;

            myImage.UpdateLayout();

Aber gibt es auch eine Methode wie OnPaint oder OnLoad, die automatisch zu beginn ausgeführt wird?

17.04.2011 - 22:05 Uhr

Ich versuch genau das gleiche jetzt in einem WPF-Window zu machen. Allerdings ist mir gleich aufgefallen das die Anwendung von Window erbt und nicht von Forms, somit steht die OnPaint-Methode garnicht zur verfügung? Oder seh ich das falsch?

Gruss Nezir

11.04.2011 - 17:01 Uhr

Hallo OasisCritter,

probiere mal die PreviewXXX-Evente.

Kannst du das ein bisschen näher beschreiben, ich bin Neueinsteiger in C# und WPF?

Muss ich da einen bestimmten Listener implementieren?

@Grumbler85: Ich habe doch ein Rect und ein Button drinn, oder werden die nicht mit vergrößert?

11.04.2011 - 16:47 Uhr

Hey,

also ich will versuchen innerhalb einer WPF-Form zu zoomen, klappt aber irgendwie nicht:

<Window x:Class="WpfApplication4.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Viewbox Grid.Row="1" Name="viewbox1" MouseDown="viewbox1_MouseDown"/>
        <Rectangle Margin="65,83,110,113" Name="rectangle1" Stroke="Black" />
        <Button Height="20" HorizontalAlignment="Right" Margin="0,44,35,0" Name="button1" VerticalAlignment="Top" Width="46">Button</Button>
    </Grid>
</Window>

Der Code:

 public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void viewbox1_MouseDown(object sender, MouseButtonEventArgs e)
        {

            if (e.LeftButton == MouseButtonState.Pressed && viewbox1.Width <= 500)
            {
                viewbox1.Height += 5;
                viewbox1.Width += 5;

                System.Console.WriteLine("Zoomed in");
            }

            if (e.RightButton == MouseButtonState.Pressed && viewbox1.Width >= 10)
            {
                viewbox1.Height -= 5;
                viewbox1.Width -= 5;
                System.Console.WriteLine("Zoomed out");
            } 
        }
    }

Es tut sich nichts und ich bekomme keine Consolenausgabe...
Was mache ich falsch?

Gruss Nezir

11.04.2011 - 12:19 Uhr

Danke^^, ich habs hinbekommen ;D
Auch an dich thx @ErfinderDesRades: ich habs mir durchgelesen, hab aber Aufgrund meiner geringen Erfahrung mit C#, die einfachere Umsetzung von herbivore bevorzugt.

Die so aussieht:

 /***
     * Class: MyGraphicObject
     * **/
    public abstract class MyGraphicObject
    {
        /**
         * @abstract : Draw-Method
         * */
        public abstract void Draw(Graphics g);

    }


    /***
     * Class : MyLine
     * To draw Line-Objects
     * **/
    class MyLine : MyGraphicObject
    {

        // Variables with standard values
        Pen lPen = new Pen(Brushes.Red, 2);
        PointF lP1 = new PointF(0, 0);
        PointF lP2 = new PointF(100, 100);

        /**
         * Constructor
         * */
        public MyLine(Pen p, PointF p1, PointF p2)
        {
            this.lPen = p;
            this.lP1 = p1;
            this.lP2 = p2;
        }

        /**
         * Draw-Method 
         * @override
         * */
        public override void Draw(Graphics g)
        {
            g.DrawLine(lPen, lP1, lP2);
        }

    }

Beim anlegen der Linie:

public void DrawLine(PointF p1, PointF p2)
        {
            MyLine gLine = new MyLine(Pens.Red, p1, p2);
            gHistory.Add(gLine);
            Invalidate();

        }

Und wie im Tut, in der Paint:

// Draw-All User-Graphics
            foreach (MyGraphicObject gO in gHistory)
            {
                gO.Draw(e.Graphics);
            }

Gruss Nezir

08.04.2011 - 17:15 Uhr

Heißt das ich muss eine eigene Klasse MyGraphicsObject erstellen, welche von Graphics erbt und die Draw-Methode überschreibt?

Und wenn das stimmt, wir hier dennoch nicht unterschieden, was jetzt gezeichnet werden soll. Man geht einfach davon aus, dass es ein Rectangle ist:

public override void Draw (Graphics g)
{
   if (Visible) {
      g.DrawRectangle (Pen, _rect);
   }
}

Ich bin grad ein bisschen verwirrt. Liefert e.Graphics, das zu zeichnende Objekt oder die Zeichenoberfläche, auf die dann das Objekt gezeichnet werden soll?
Oder liefert "gO" die Zeichenoberfläche auf die gezeichnet werden soll?

Warum ist in C# alles ein Graphics-Objekt? Woher soll das Graphics-Objekt denn wissen was es jetzt ist (Line, Rect etc.)?

08.04.2011 - 16:49 Uhr

Ja, ich hab das jetzt so gemacht:

private List<Graphics> gHistory = new List<Graphics>();

Graphics gLine = this.CreateGraphics();
            gLine.DrawLine(Pens.Red, p1, p2);
            gHistory.Add(gLine);

// und in der OnPaint()...

 foreach (Graphics gO in gHistory)
            {
                gO.draw...?!?
            }


Das Problem ist, wenn ich gO.draw... mache, hab ich die ganze Auswahl ( DrawLine, Draw..etc), es gibt nicht wie in dem Tutbeispiel nur "Draw".

08.04.2011 - 16:32 Uhr

Vielen Danke erstmal für die Antworten, dadurch haben sich einige Fragen geklärt.

Zu deinem Tut @herbivore:

Wenn ich jetzt meine zu zeichnenden Graphics-Objekte in einer ArrayList speichere.
Wie kann ich dann in diesem Teil hier:

foreach (MyGraphicObject go in _listgo) {
      go.Draw (e.Graphics);
   }

unterscheiden, was nun gezeichnet werden soll? Das muss dann doch zur Laufzeit geprüft werden, da die ArrayList (Lines, Rectangles etc.) beinhalten kann?

Ist es richtig, dass ich die GraphicObjekte, so speichern kann?:


private ArrayList gHistory = new ArrayList();

Graphics gLine = this.CreateGraphics();
            gLine.DrawLine(Pens.Red, p1, p2);
            gHistory.Add(gLine);

Übrigens, sehr gutes Tut 😉

Danke

07.04.2011 - 14:41 Uhr

Hallo,

ich bin C#-Einsteiger und habe eine Frage bezüglich Layers auf WinForms.

  1. Versteh ich das richtig, das jedes Graphics Objekt ein eigenes Layer hat?

1.1. Wenn Ja, wie kann ich einzelne Graphic Objekte ein- und ausblenden ohne deren Inhalt zu löchen?

1.2. Wenn Nein, wie geht man am besten damit um, also wie erstellt man für jedes Graphic Objekt ein eigenes Layer?

  1. Ich will ein kleines Grafikprogramm machen, in dem man Linien und Kurven einzeichnen kann und jede Linie/Kurve soll ihr eigenes Layer haben, sodass man beliebige Layer, ein und ausblenden kann.

Die Verwaltung der Layer soll über eine CheckedListBox geregelt werden. Ist der Ansatz gut, wenn ich sage, dass ich ein Graphics[] erstelle und dort alle Graphic-Objekte mit ihren Layers speichere?

Danke im Voraus.

Gruß OC