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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

WPF

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

Q&A

解決済

2回答

5673閲覧

WPF 画像に文字を挿入

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

0クリップ

投稿2020/01/08 10:23

こんばんわ。神村亮佑です。
今回、WPFを勉強している際に、PhotoShopの機能を模倣していくことを教授にアドバイスをいただきました。
そこで、私はPhotoShopをWPFでコードを書いております。
そのPhotoShopの機能の一つに画像にテキストを埋め込むという機能(横書き文字ツール)があります。
イメージ説明

今回、その機能をWPFで実装していこうと考えております。
具体的には、マウスで大体の大きさの枠を決め、そこに文字を書いていきたいと考えています。

しかし、試行錯誤しググった結果、良い方法が見つからないため、今回ご質問させていただきました。
お時間ございましたら、ご回答よろしくお願いします。

試したこと

CanvasにImageタブとTextBlockタブを作成し、コード上での上記の画像は作成できました。
しかし、マウスから情報を取得し、TextBlockを作成する方法がわからなかったため質問させていただきました。

そのコードはこちらです。

xaml

1<Window x:Class="PhotoShop.Test" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:PhotoShop" 7 mc:Ignorable="d" 8 Title="Test" Height="450" Width="800"> 9 <Grid> 10 <Canvas> 11 <Image Source="Resources\whippet.jpg" Stretch="Fill" Height="421" Width="643" /> 12 <TextBox Text="神村亮佑" FontSize="16px" FontWeight="bold" Foreground="Red" Height="421" Width="793"/> 13 14 15 </Canvas> 16 </Grid> 17</Window> 18

###補足情報

OS windows 10 Home
C# 7.0
Visual Studio 2019

方針又は、解決方法のご回答よろしくお願いします。

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

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

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

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

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

m.ts10806

2020/01/08 21:45

>試行錯誤しググった結果 が質問本文にはどこにも現れていません。 試したこと調べたことを具体的に記載してください。 https://teratail.com/help/question-tips#questionTips1-2 >検索して見つけたページでわからない事があれば、どのページのどの部分がわからないのかを明確に記し質問してみてください。
Zuishin

2020/01/09 01:03

「WPF マウスイベント」で探せばいいのではないでしょうか。
退会済みユーザー

退会済みユーザー

2020/01/09 01:52

やってみます!ありがとうございます。 できたらまた、この回答に投稿します。
guest

回答2

0

ベストアンサー

PhotoShopの機能を模倣していくこと

入門者にはあまりに壮大な目標に感じますが、まあどこまでやるかによりますね。

PhotoShopは持っていませんが、ツールバーにある[TEXT]ボタンを選択して画面をクリックするとそこに枠が出る(ドラッグで範囲指定?)みたいなやつですね?
フォントや色を変更できて、欲を言えばマウスで移動やリサイズができる。と

凝ったUIの作りこみはロジック以上に難しいことが多いです(私はあまり手を出さないようにしています^^;
とはいえ出発点としてミニマムかつ、そこそこ遊べるような参考コードを書いてみました。

[仕様]
画像エリアをダブルクリックでその場所にTextBoxを生成
TextBoxの右クリックメニューに削除(コピー等はTextBoxのコピーではなく、テキストのコピー)
テキストの編集はその場で可能(複数行に対応)
ほかのプロパティはPropertyGridで編集(クリックしたTextBoxPropertyGridに割り当てるため、選択が少し重いです)

  • 移動はCanvasLeftCanvasTop
  • サイズはWidthHeightNaNで自動調整)
  • フォントはFontなんちゃら
  • 色はForeground

NuGetからExtended.Wpf.Toolkitをインストールしてください(PropertyGridだけ使います)

xml

1<Window 2 x:Class="Questions233943.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Questions233943" 6 xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 7 Width="800" 8 Height="450"> 9 <Window.Resources> 10 <ContextMenu x:Key="TextBoxContextMenu"> 11 <MenuItem Command="ApplicationCommands.Copy" /> 12 <MenuItem Command="ApplicationCommands.Cut" /> 13 <MenuItem Command="ApplicationCommands.Paste" /> 14 <MenuItem Click="DelMenuItem_Click" Header="削除" /> 15 </ContextMenu> 16 17 <Style x:Key="TextBoxStyle" TargetType="{x:Type local:TextBoxEx}"> 18 <Setter Property="AcceptsReturn" Value="True" /> 19 <Setter Property="AcceptsTab" Value="True" /> 20 <Setter Property="Background" Value="{x:Null}" /> 21 <Setter Property="BorderBrush" Value="{x:Null}" /> 22 <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" /> 23 <Setter Property="FontSize" Value="16px" /> 24 <Setter Property="FontWeight" Value="bold" /> 25 <Setter Property="Foreground" Value="Red" /> 26 <Setter Property="Text" Value="テキスト" /> 27 <Setter Property="TextWrapping" Value="Wrap" /> 28 <Setter Property="Template"> 29 <Setter.Value> 30 <ControlTemplate TargetType="{x:Type TextBox}"> 31 <Border 32 x:Name="border" 33 Background="{TemplateBinding Background}" 34 BorderBrush="{TemplateBinding BorderBrush}" 35 BorderThickness="{TemplateBinding BorderThickness}" 36 SnapsToDevicePixels="True"> 37 <ScrollViewer 38 x:Name="PART_ContentHost" 39 Focusable="false" 40 HorizontalScrollBarVisibility="Hidden" 41 VerticalScrollBarVisibility="Hidden" /> 42 </Border> 43 <ControlTemplate.Triggers> 44 <Trigger Property="IsMouseOver" Value="true"> 45 <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" /> 46 </Trigger> 47 <Trigger Property="IsFocused" Value="true"> 48 <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" /> 49 </Trigger> 50 </ControlTemplate.Triggers> 51 </ControlTemplate> 52 </Setter.Value> 53 </Setter> 54 </Style> 55 </Window.Resources> 56 <Grid> 57 <Grid.ColumnDefinitions> 58 <ColumnDefinition Width="2*" /> 59 <ColumnDefinition Width="5" /> 60 <ColumnDefinition /> 61 </Grid.ColumnDefinitions> 62 <Canvas x:Name="canvas" MouseLeftButtonDown="Canvas_MouseLeftButtonDown"> 63 <Image Source="Resources\whippet.jpg" /> 64 </Canvas> 65 <GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" /> 66 <xctk:PropertyGrid x:Name="propertyGrid" Grid.Column="2" /> 67 </Grid> 68</Window>

cs

1using System.Windows; 2using System.Windows.Controls; 3using System.Windows.Input; 4 5namespace Questions233943 6{ 7 // PropertyGridでいじれるようにCanvas.Left Canvas.Topをラップ 8 public class TextBoxEx : TextBox 9 { 10 public static readonly DependencyProperty CanvasLeftProperty 11 = DependencyProperty.Register(nameof(CanvasLeft), typeof(double), typeof(TextBoxEx), 12 new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasLeftChanged))); 13 public double CanvasLeft { get => (double)GetValue(CanvasLeftProperty); set => SetValue(CanvasLeftProperty, value); } 14 private static void OnCanvasLeftChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 15 { 16 if(obj is TextBoxEx ctrl) Canvas.SetLeft(ctrl, ctrl.CanvasLeft); 17 } 18 19 public static readonly DependencyProperty CanvasTopProperty 20 = DependencyProperty.Register(nameof(CanvasTop), typeof(double), typeof(TextBoxEx), 21 new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasTopChanged))); 22 public double CanvasTop { get => (double)GetValue(CanvasTopProperty); set => SetValue(CanvasTopProperty, value); } 23 private static void OnCanvasTopChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 24 { 25 if(obj is TextBoxEx ctrl) Canvas.SetTop(ctrl, ctrl.CanvasTop); 26 } 27 } 28 29 public partial class MainWindow : Window 30 { 31 public MainWindow() => InitializeComponent(); 32 33 private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 34 { 35 if(e.ClickCount == 2) 36 { 37 var textBox = new TextBoxEx 38 { 39 Style = FindResource("TextBoxStyle") as Style, 40 CanvasLeft = e.GetPosition(canvas).X, 41 CanvasTop = e.GetPosition(canvas).Y 42 }; 43 textBox.GotFocus += TextBox_GotFocus; 44 canvas.Children.Add(textBox); 45 } 46 } 47 48 private void TextBox_GotFocus(object sender, RoutedEventArgs e) 49 => propertyGrid.SelectedObject = sender; 50 51 private void DelMenuItem_Click(object sender, RoutedEventArgs e) 52 { 53 if(sender is MenuItem menuItem) 54 { 55 if(menuItem.Parent is ContextMenu contextMenu) 56 { 57 if(contextMenu.PlacementTarget is TextBoxEx textBox) 58 { 59 propertyGrid.SelectedObject = null; 60 textBox.GotFocus -= TextBox_GotFocus; 61 canvas.Children.Remove(textBox); 62 } 63 } 64 } 65 } 66 } 67}

マウスでサイズ変更・移動をちゃんとやるなら、この辺を参考に頑張ってください。

投稿2020/01/09 09:13

編集2023/07/17 13:47
TN8001

総合スコア9321

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

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

退会済みユーザー

退会済みユーザー

2020/01/09 10:50

ご回答ありがとうございます。 マウスでのサイズ変更・移動を頑張ってやってみます。 また、その方針を示していただきありがとうございます。 頑張ってやってみたいと思います。ありがとうございます!
guest

0

Marginをバインディングするのはどうでしょうか

C#

1public Thickness TextBlockMargin { get; set; } 2TextBlockMargin = new Thickness(5,5,5,5);

XAML

1<TextBox Text="神村亮佑" FontSize="16px" FontWeight="bold" Foreground="Red" Height="421" Width="793" Margin="{Binding TextBlockMargin}"/>

投稿2020/01/09 00:44

homu_homu_ai

総合スコア96

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

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

退会済みユーザー

退会済みユーザー

2020/01/09 01:52

ありがとうございます。やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問