简体   繁体   English

C# WPF 在 UserControl 中绘制 OxyPlot

[英]C# WPF Draw OxyPlot in UserControl

I wanted to draw a coordinate system with OxyPlot in a UserControl.我想在 UserControl 中使用 OxyPlot 绘制坐标系。 Unfortunately, there are two mistakes.不幸的是,有两个错误。 I do not know why they are standing there.我不知道他们为什么站在那里。 And this UserControl then later in my MainWindow when one presses on a certain button in the MainWindow application.当按下 MainWindow 应用程序中的某个按钮时,这个 UserControl 然后在我的 MainWindow 中。

Can someone tell me where the error lies and fix it?有人可以告诉我错误在哪里并修复它吗?

This works in another application.这适用于另一个应用程序。 This is also not UserControl but MainWindow.这也不是 UserControl,而是 MainWindow。

Errors:错误:

  • "UCScreen" does not contain a definition for "Title", and you could not find a title extension method that accepts a first UCVoucher type argument “UCScreen”不包含“Title”的定义,并且您找不到接受第一个 UCVoucher 类型参数的标题扩展方法

  • The name "creator" does not exist in the current context.当前上下文中不存在名称“创建者”。

I have marked the errors in the code with a comment我用注释标记了代码中的错误

UserControl用户控件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OxyPlot;
using OxyPlot.Series;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;
using System.Globalization;

namespace Vorschau
{
    /// <summary>
    /// Interaktionslogik für UCVorschau.xaml
    /// </summary>
    public partial class UCVorschau : UserControl
    {
        public UCVorschau()
        {
            InitializeComponent();
            DataContext = this; //Here is an error
            this.Title = "Vorschaubild";
        }

        public IList<DataPoint> Points { get; private set; }

        /// <summary>
        /// Einstelungs-Fenster wird geöffnet
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //btEinstellung


        private void btGenerate_Click(object sender, RoutedEventArgs e)
        {
            DateTime startZeit = DateTime.Now;
            Cursor = Cursors.Wait;

            double zufallszahlX;
            double zufallszahlY;

            double XMax = 10;
            double XMin = 0;
            double YMax = 10;
            double YMin = 0;
            // Zur Erstellung des Seeds
            int h = DateTime.Now.Hour;
            int m = DateTime.Now.Minute;
            int s = DateTime.Now.Second;
            String u = h.ToString() + m.ToString() + s.ToString();
            int iu = Int32.Parse(u);
            Random zufall = new Random(iu);
            Console.WriteLine("______________");
            CultureInfo en = new CultureInfo("en-US", false); // Damit ein Punkt ist anstatt ein Komma
            DataContext = this;
            this.Points = new List<DataPoint>();
            System.IO.File.WriteAllText(((Environment.CurrentDirectory + @"\files\koordinaten.txt")), string.Empty);
            using (var fileStream = new FileStream(String.Format(Environment.CurrentDirectory + @"\files\koordinaten.txt"), FileMode.OpenOrCreate))
            using (var streamWriter = new StreamWriter(fileStream))
            {
                for (int i = 1; i <= 10; i++)
                {
                    zufallszahlX = zufall.NextDouble() * (XMax - XMin) + XMin;
                    zufallszahlY = zufall.NextDouble() * (YMax - YMin) + YMin;
                    //Console.WriteLine("( " + zufallszahlX + " / " + zufallszahlY + " )" + " |" + i);
                    streamWriter.WriteLine("( " + zufallszahlX.ToString(en.NumberFormat) + " / " + zufallszahlY.ToString(en.NumberFormat) + " )" + " |" + i);
                    creator.addPoint(zufallszahlX, zufallszahlY); //Here is an error
                    Points.Add(new DataPoint(zufallszahlX, zufallszahlY));
                }
                ls.ItemsSource = Points;
            }
            Cursor = Cursors.Arrow;
            DateTime endZeit = DateTime.Now;
            TimeSpan gemesseneZeit = endZeit - startZeit;
           // statusbar.Text = "Gemessen Zeit für den Durchlauf: " + gemesseneZeit;
        }
    }
}

<UserControl x:Class="Vorschau.UCVorschau"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Vorschau"
             xmlns:oxy="http://oxyplot.org/wpf"
             mc:Ignorable="d" Height="461" Width="624">
    <Canvas HorizontalAlignment="Left" Height="461" VerticalAlignment="Top" Width="624">
        <Button x:Name="btGenerate" Content="Generiere Koordinaten" Canvas.Left="25" Canvas.Top="409" Click="btGenerate_Click"/>
        <oxy:Plot x:Name="oxyPlot" Title="{Binding Title}" Height="245" Canvas.Left="298" Canvas.Top="32" Width="273" Background="#FFD1CFD0">
            <oxy:Plot.Series>
                <oxy:LineSeries x:Name="ls" ItemsSource="{Binding Points}" LineStyle="None"  MarkerType="Square" MarkerSize="5" MarkerFill="Black"/>
            </oxy:Plot.Series>

        </oxy:Plot>
    </Canvas>
</UserControl>

The UserControl class has no Title property but the Plot class has. UserControl类没有Title属性,但Plot类有。 You probably want to set this one:你可能想设置这个:

public UCVorschau()
{
    InitializeComponent();
    DataContext = this; //Here is an error
    oxyPlot.Title = "Vorschaubild";
}

Or you should add a Title property to the UserControl class:或者您应该向UserControl类添加一个Title属性:

public UCVorschau()
{
    InitializeComponent();
    DataContext = this; //Here is an error
    this.Title = "Vorschaubild";
}

public string Title { get; set; }

Then the binding that you define in the XAML markup should work.然后您在 XAML 标记中定义的绑定应该可以工作。

Regarding the "creator" I don't know what that is.关于“创造者”,我不知道那是什么。 Since you are adding the DataPoint to the Points collection you might as well remove this line I guess.由于您将DataPoint添加到Points集合中,因此我猜您最好删除此行。 Or you could add the DataPoint directly to the "ls" LineSeries that you have defined in your XAML markup:或者,您可以将DataPoint直接添加到您在 XAML 标记中定义的“ls” LineSeries

ls.addPoint(zufallszahlX, zufallszahlY);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM