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

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

新規登録して質問してみよう
ただいま回答率
85.50%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

14194閲覧

WPF、canvas上の子要素の消去方法

marche

総合スコア7

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2016/08/27 13:04

canvas上のクリックした場所に図形やフォントを配置するというプログラムを、WPFで作っています。言語はC#、開発環境はvisual studio 2012 for Desktopを使用しています。
子要素をクリックで選んで消去させたいのですが、どのようにすれば良いのか分からないため、教えて頂きたいです。

###該当のソースコード
C#

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; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { double x = 0; double y = 0; double x1 = 0; double x2 = 0; double y1 = 0; double y2 = 0; double x3 = 0; double y3 = 0; bool flag = true; bool flag1 = true; int counter = 0; public MainWindow() { InitializeComponent(); } // 線描画モード private void button_Click(object sender, RoutedEventArgs e) { flag = false; } // マウスクリック位置(押したとき)取得 private void Root_MouseDown(object sender, MouseButtonEventArgs e) { if (flag == false) { Point pos1 = e.GetPosition(Root); x1 = pos1.X; y1 = pos1.Y; } if (flag1 == false) { Point pos3 = e.GetPosition(Root); x3 = pos3.X; y3 = pos3.Y; textblock(); } } // マウスクリック位置(離したとき)取得 private void Root_MouseUp(object sender, MouseButtonEventArgs e) { if (flag == false) { Point pos2 = e.GetPosition(Root); x2 = pos2.X; y2 = pos2.Y; x = x2; y = y2; CreateLine(); } } // 線描画 public void CreateLine() { Line blackLine = new Line(); blackLine.X1 = x1; blackLine.Y1 = y1; blackLine.X2 = x2; blackLine.Y2 = y2; SolidColorBrush blackBrush = new SolidColorBrush(); blackBrush.Color = Colors.Black; blackLine.StrokeThickness = 1; blackLine.Stroke = blackBrush; canvas.Children.Add(blackLine); } // 文字描画モード private void button1_Click(object sender, RoutedEventArgs e) { flag = true; flag1 = false; } // textboxをtextblockにバインド public void textblock() { TextBlock tblock = new TextBlock(); tblock.Width = 23; tblock.MouseEnter += tblock_MouseEnter; tblock.MouseLeave += tblock_MouseLeave; tblock.SetValue(Canvas.TopProperty, y3); tblock.SetValue(Canvas.LeftProperty, x3); Binding bind = new Binding(); bind.ElementName = "textBox1"; bind.Path = new PropertyPath(TextBox.TextProperty); bind.Mode = BindingMode.OneTime; tblock.SetBinding(TextBlock.TextProperty, bind); canvas.Children.Add(tblock); counter++; flag1 = true; } private void tblock_MouseLeave(object sender, MouseEventArgs e) { TextBlock tb = sender as TextBlock; tb.Background = SystemColors.WindowBrush; } void tblock_MouseEnter(object sender, MouseEventArgs e) { TextBlock tb = sender as TextBlock; tb.Background = SystemColors.HighlightBrush; } } }

xmal

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="0*"/> <ColumnDefinition Width="100px"/> </Grid.ColumnDefinitions> <Viewbox x:Name="View" Stretch="UniformToFill"> <Border x:Name="Root" Background="Transparent" MouseDown="Root_MouseDown" MouseUp="Root_MouseUp" Width="300" Height="400"> <Canvas x:Name="canvas" Background="Transparent" /> </Border> </Viewbox> <StackPanel Orientation="Vertical" Background="Gray" Grid.Column="2"> <Button x:Name="button" Content="線" Click="button_Click"/> <TextBox x:Name="textBox1" HorizontalAlignment="Left" Width="100"/> <Button x:Name="button1" Height="24" Click="button1_Click" VerticalAlignment="Top" HorizontalAlignment="Left" Content="文字" Width="100"/> </StackPanel> </Grid> </Window>

上記のソースでは、ボタンクリックで追加する子要素を選択し、canvasをクリックして貼り付けることまでのみ可能です。
宜しくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

どういうユーザビリティを想定されているかによってハンドルするイベントは異なると思います。
また、オブジェクトの種類に依らずに機能を実装できるように設計を最適化する必要はあると思いますが、
そこは本題ではないので触れません。

単純にオブジェクトを選択したタイミングでCanvasから削除すれば良いと思います。

C#

1public void CreateLine() 2{ 3 Line blackLine = new Line(); 4 blackLine.MouseDown += (sender, e) => 5 { 6 if (MessageBox.Show("消す?") == MessageBoxResult.OK) 7 { 8 canvas.Children.Remove(blackLine); 9 } 10 }; 11 blackLine.X1 = x1; 12 blackLine.Y1 = y1; 13 blackLine.X2 = x2; 14 blackLine.Y2 = y2; 15 16 SolidColorBrush blackBrush = new SolidColorBrush(); 17 blackBrush.Color = Colors.Black; 18 19 blackLine.StrokeThickness = 1; 20 blackLine.Stroke = blackBrush; 21 22 canvas.Children.Add(blackLine); 23}

※フラグの制御は割愛。

なお、もしこれがNGであればどういう実装だとどうNGなのか、先に要件を明確にするべきです。

投稿2016/08/27 14:36

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marche

2016/08/27 22:32

教えて頂いたコードを追記したところ考えていた通りの動作になりました。 助かりました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問