前提・実現したいこと
ボタンを押したら多角形の図形をWPFのimage上に表示したいと考えております
ネット上を「c# WPF MVVM 図形」等のキーワードで探したのですが
これという内容見つけられませんでした。
画像表示と同じ手法でBitmapに描画したデータを代入すれば
可能と考えたのですが、うまく行きませんでした。
(https://teratail.com/questions/349227?nli=60ed5468-1ed8-4b74-8894-4a3c0a040114#reply-478633)
MVVM形式での多角形の図形表示について参考になるページ、
アドバイス等よろしくお願いします。
環境: Win10 、VS2019、C#
フレームワーク:Prism、ReactiveProperty
MainWindow.xaml
<Window x:Class="DrawCircle.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True" Title="{Binding Title}" Height="400" Width="500" WindowStartupLocation="CenterScreen"> <Grid> <StackPanel> <Button Content="画像表示" Command="{Binding ImageDispLayButton}" /> <Image Stretch="None" Source="{Binding Bitmap2.Value}" Height="381" Width="496" /> <ContentControl prism:RegionManager.RegionName="ContentRegion" /> </StackPanel> </Grid> </Window>
MainWindowViewModel.cs
using Prism.Mvvm; using System.Windows; using Reactive.Bindings; using System.Windows.Media.Imaging; using System; using Prism.Commands; using System.Drawing; namespace DrawCircle.ViewModels { public class MainWindowViewModel : BindableBase { public ReactiveProperty<Bitmap> Bitmap2 { get; } = new ReactiveProperty<Bitmap>(); public ReactiveCommand ImageDispLayButton { get; } = new ReactiveCommand(); public MainWindowViewModel() { //ReactiveCommandの宣言 ImageDispLayButton.Subscribe(ImageDispLayButtonExe); } /// <summary> /// ボタン押下で任意の画像を表示する /// </summary> private void ImageDispLayButtonExe() { //図形表示 Bitmap canvas = new Bitmap(200, 200); Graphics g = Graphics.FromImage(canvas); g.FillRectangle(Brushes.Black, 10, 20, 100, 80); Bitmap2.Value = canvas; MessageBox.Show("図形描画"); g.Dispose(); } } }
試したこと
非MVVMでの図形描画ならGridの子要素にAddする形で図形をWPFに
表示できることは確認済です。
imageコントロールに図形描画をすること自体、考え違いを
しているのでしょうか?
補足情報(FW/ツールのバージョンなど)
環境: Win10 、VS2019、C#
フレームワーク:Prism、ReactiveProperty
2021/07/15 追記
コメント欄に書いていたソースをこちらにの追加
実現したいことは MainWindow.xaml.cs に実装している MenuItem7_Click() の多角形描画処理を
MVVM化して描画させたいと思っています
実装に際しての不明点
どのようにコーディングすればWPF側に図を表示できるのかわからない状態です。
今の私の理解では、JPG画像のようにImageにセットすればよいのか、追記したサンプルコードのように
子要素の追加すればよいのか、よく理解できていません。
MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="500" Width="700"> <Grid> <StackPanel Name="StackPanel1" VerticalAlignment="Top" Orientation="Horizontal"> <Menu Height="23" Name="Menu1"> <MenuItem Header="TEST項目" Name="MenuItem1"> <MenuItem Header="クリア" Name="MenuItem0" Click="MenuItem0_Click"/> <MenuItem Header="サンプル多角形" Name="MenuItem7" Click="MenuItem7_Click"/> </MenuItem> </Menu> </StackPanel> <Grid Name="Grid1"> </Grid> </Grid> </Window>
MainWindow.xaml.cs
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 WpfApp1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void MenuItem0_Click(object sender, RoutedEventArgs e) { Grid1.Children.Clear(); ////描画領域の初期化 } /// <summary> /// 多角形描画 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MenuItem7_Click(object sender, RoutedEventArgs e) { Path myPath5 = new Path(); myPath5.Stroke = Brushes.Black; ////ブラシ色 myPath5.Fill = Brushes.RoyalBlue; ////塗りつぶし色 myPath5.StrokeThickness = 1; ////ブラシ太さ設定 PathFigure myPathFigure = new PathFigure(); ////ひし形を描画 myPathFigure.StartPoint = new Point(100, 80); ////描画の開始座標 myPathFigure.Segments.Add(new LineSegment(new Point(150, 130), true)); myPathFigure.Segments.Add(new LineSegment(new Point(100, 180), true)); myPathFigure.Segments.Add(new LineSegment(new Point(50, 130), true)); myPathFigure.Segments.Add(new LineSegment(new Point(100, 80), true)); PathGeometry myPathGeometry = new PathGeometry(); myPathGeometry.Figures.Add(myPathFigure); myPath5.Data = myPathGeometry; Grid1.Children.Add(myPath5); } } }
回答1件
あなたの回答
tips
プレビュー