質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.04%

図形描写後にフォントボックスを貼り付けたい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,249

marche

score 7

現在WPF、言語はC#でアプリケーションを作成しております。
図形描写後に名前を付け、消去する際にはその図形と名前を一括で消したいのですが中々うまくいかない為教えて頂きたくて質問しました。

下記のソースコードは、マウスクリック&ドラッグで円を二つ描き描画後テキストボックスに入力した文字を二つ目の円の場所に貼り付けるものです。
ですが、円のインデックス位置を文字から無理矢理割り出して消去しておりズレが生じるとエラーが生じてしまいます。どのようにすれば良いのでしょうか?

開発環境はvisual studio 2012 for Desktopを使用しております。
宜しくお願いします。

該当のソースコード

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        double x1 = 0;          // 旗始点(x)
        double y1 = 0;          // 旗始点(y)
        double x2 = 0;          // 旗終点(x)
        double y2 = 0;          // 旗終点(y)
        bool flag = true;       // 旗描画モード切替
        bool flag2 = true;      // 旗消去モード切替
        bool flag3 = true;
        int counter = 0;
        int counter2 = 0;

        SolidColorBrush BlackBrush = new SolidColorBrush(Colors.Black);
        SolidColorBrush RedBrush = new SolidColorBrush(Colors.Red);

        public MainWindow()
        {
            InitializeComponent();
            canvas.EditingMode = InkCanvasEditingMode.None;
            BlackBrush.Freeze();
            RedBrush.Freeze();
        }

        // 図形描画モード
        private void button_Click(object sender, RoutedEventArgs e)
        {
            flag = false;
            flag2 = true;
            canvas.EditingMode = InkCanvasEditingMode.None;
        }

        // マウスクリック位置(押したとき)取得
        private void Root_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (flag == false)
            {
                System.Windows.Point pos1 = e.GetPosition(canvas);
                x1 = pos1.X;
                y1 = pos1.Y;

                textBox1.Text = null;
            }
        }

        // マウスクリック位置(離したとき)取得
        private void Root_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (flag == false)
            {
                System.Windows.Point pos2 = e.GetPosition(canvas);
                x2 = pos2.X;
                y2 = pos2.Y;

                CreateElipse();
            }
        }

        // 描画
        public void CreateElipse()
        {
            EllipseGeometry ellipse1 = new EllipseGeometry();
            System.Windows.Shapes.Path P1 = new System.Windows.Shapes.Path();

            EllipseGeometry ellipse2 = new EllipseGeometry();
            System.Windows.Shapes.Path P2 = new System.Windows.Shapes.Path();

            ellipse1.Center = new System.Windows.Point(x1, y1);
            ellipse1.RadiusX = 1;
            ellipse1.RadiusY = 1;

            ellipse2.Center = new System.Windows.Point(x2, y2);
            ellipse2.RadiusX = 3;
            ellipse2.RadiusY = 3;

            if (tgBtn.IsChecked == true && tgBtn2.IsChecked == false)
            {
                // 消去処理
                P1.MouseDown += (sender, e) =>
                {
                    if (flag2 == false)
                    {
                        canvas.Children.Remove(P1);
                        canvas2.Children.Remove(P2);
                    }
                };
            }

                if (tgBtn2.IsChecked == false)
                {
                    // 円設定
                    P1.Fill = RedBrush;
                    P1.Stroke = RedBrush;
                    P1.StrokeThickness = 1;
                    P1.Data = ellipse1;

                    P2.Fill = RedBrush;
                    P2.Stroke = RedBrush;
                    P2.StrokeThickness = 3;
                    P2.Data = ellipse2;

                    counter2 = canvas.Children.Capacity;

                    if (counter2 == 0)
                    {
                        canvas.Children.Add(P1);
                        canvas2.Children.Add(P2);
                        textBox1.Text = null;
                        flag3 = false;
                    }
                    else
                    {
                        if (tgBtn.IsChecked == false && tgBtn3.IsChecked == false && flag3 == true)
                        {
                            MessageBox.Show("文字が記入されていません\n(文字記入後消去してください)");
                        }
                        else
                        {
                            canvas.Children.Add(P1);
                            canvas2.Children.Add(P2);

                            textBox1.Text = null;
                            tgBtn3.IsChecked = false;
                            flag3 = false;
                        }
                    }
            }
        }

        private void textBox1_LostFocus(object sender, RoutedEventArgs e)
        {
            if (flag == true)
            {
            }
            else
            {
                TextBlock tblock2 = new TextBlock();

                SolidColorBrush Brush2 = new SolidColorBrush(Colors.Transparent);
                Brush2.Freeze();

                tblock2.Background = Brush2;


                Binding bind3 = new Binding();
                bind3.ElementName = "textBox1";
                bind3.Path = new PropertyPath(TextBox.TextProperty);
                //bind3.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
                bind3.Mode = BindingMode.OneTime;
                tblock2.SetBinding(TextBlock.TextProperty, bind3);

                if (tgBtn2.IsChecked == true && tgBtn.IsChecked == false)
                {
                    tblock2.MouseDown += (sender2, e2) =>
                    {
                        if (flag2 == false)
                        {
                            canvas.Children.Remove(tblock2);
                        }
                    };
                }

                if (tgBtn.IsChecked == false)
                {
                    if (tgBtn2.IsChecked == false)
                    {
                        // 消去処理
                        tblock2.MouseDown += (sender2, e2) =>
                        {
                            if (flag2 == false)
                            {
                                counter = canvas.Children.IndexOf(tblock2);

                                if (counter == 1)
                                {
                                    canvas.Children.Remove(tblock2);
                                    canvas.Children.RemoveAt(counter - 1);
                                    canvas2.Children.RemoveAt(counter - 1);
                                }
                                else
                                {
                                    MessageBox.Show(counter.ToString());
                                    MessageBox.Show((counter - 1).ToString());
                                    MessageBox.Show(((counter - 1) - ((counter - 1) / 2)).ToString());

                                    canvas.Children.Remove(tblock2);
                                    canvas.Children.RemoveAt(counter - 1);
                                    canvas2.Children.RemoveAt((counter - 1) - ((counter - 1) / 2));
                                }
                            }
                        };

                        tblock2.SetValue(InkCanvas.TopProperty, y2);
                        tblock2.SetValue(InkCanvas.LeftProperty, x2);
                    }
                    // 文字だけモード
                    else
                    {
                        tblock2.SetValue(InkCanvas.TopProperty, y1);
                        tblock2.SetValue(InkCanvas.LeftProperty, x1);
                    }
                }

                tblock2.Foreground = BlackBrush;

                if (tblock2.Text != null && tgBtn.IsChecked == false)
                {
                    canvas.Children.Add(tblock2);
                    tgBtn3.IsChecked = true;
                }
            }
        }

        // 消去モード
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            flag2 = false;
            flag = true;

            canvas.EditingMode = InkCanvasEditingMode.None;
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る