3

WPF の「タッチ」アプリケーションで線を描画したいので、次のコードを書きました。

XAML (一部) :

<Canvas x:Name="MainCanvas"
            IsManipulationEnabled="True"
            TouchDown="MainCanvas_TouchDown" 
            TouchUp="MainCanvas_TouchUp">

C# :

public partial class MainWindow : Window
{
    Line myLine = new Line();

    public MainWindow()
    {
        InitializeComponent();
    }

    public void MainCanvas_TouchDown(object sender, TouchEventArgs e)
    {
        myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
        myLine.StrokeThickness = 2;
        // Line's starting point
        myLine.X1 = e.GetTouchPoint(this).Position.X;
        myLine.Y1 = e.GetTouchPoint(this).Position.Y;
    }

    public void MainCanvas_TouchUp(object sender, TouchEventArgs e)
    {
        // Line's ending point
        myLine.X2 = e.GetTouchPoint(this).Position.X;
        myLine.Y2 = e.GetTouchPoint(this).Position.Y;

        MainCanvas.Children.Add(myLine);


    }
}

これで一本の線しか引けません。別の絵を描こうとすると、アプリケーションがクラッシュします。

4

2 に答える 2

2

Line描画する線ごとに、新しいインスタンスを作成する必要があります。現在のコードにはLineインスタンスが 1 つしかありませんが、そのインスタンスは表示されている 1 行を正確に表しています。

さまざまなオブジェクトを使用してグラフィック要素を描画面に段階的に描画する他のグラフィック ツールキットとは異なり、WPF はベクター グラフィックスのように機能します。使用する各オブジェクトグラフィック要素です。2 つの同一のグラフィック要素の場合、同じプロパティを持つ 2 つのオブジェクトが必要になります。

したがって、同じグラフィカル オブジェクトを 2 回目に追加すると、次の行に次のようになります。

MainCanvas.Children.Add(myLine);

各グラフィック要素は一度しか追加できないため、例外がスローされます。

任意の数の行を追加したい場合は、行をリストに保存Lineし、タッチダウン イベントで新しい行のインスタンスを追加します (つまり、クラスをインスタンス化し、新しい行をキャンバスに追加します)。タッチアップ イベントで、新しいインスタンスの 2 番目のポイント (リストの最後の要素) を設定します。

これは C# に関するものではなく、WPF に関するものであることに注意してください。(つまり、WPF を使用したことがない C# の専門家にはわかりませんが、C# を使用したことがない (たとえば、常に VB.NET を使用している) WPF 開発者は役立つかもしれません。

于 2013-05-20T00:53:08.727 に答える
1

OR Mapper の回答のおかげで、ここに解決策があります。彼が説明するように、ラインごとに新しい Line インスタンスを作成する必要があります。

public partial class MainWindow : Window
{
    List<Line> lines = new List<Line>();

    public void MainCanvas_TouchDown(object sender, TouchEventArgs e)
    {
        Line myLine = new Line();           
        myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
        myLine.StrokeThickness = 2;
        myLine.X1 = e.GetTouchPoint(this).Position.X;
        myLine.Y1 = e.GetTouchPoint(this).Position.Y;
        lines.Add(myLine);
    }

    public void MainCanvas_TouchUp(object sender, TouchEventArgs e)
    {
        lines[lines.Count - 1].X2 = e.GetTouchPoint(this).Position.X;
        lines[lines.Count - 1].Y2 = e.GetTouchPoint(this).Position.Y;
        MainCanvas.Children.Add(lines[lines.Count - 1]);
    }
}
于 2013-07-09T18:21:35.190 に答える