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

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

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

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

WPF

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

Q&A

解決済

1回答

5097閲覧

Extended.WPF.Toolkitの使い方について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

0クリップ

投稿2020/01/29 09:37

Extended.WPF.Toolkitを別ウィンドウに追加した際、Extended.WPF.Toolkitで編集できなくなりました。

###コードの説明
画像を表示させ、クリックが2回されたら、TextBoxを表示させて、Extended.WPF.Toolkitで編集できるようにする。
しかし、Extended.WPF.Toolkitで編集できないためご質問させていただきました。

発生している問題・エラーメッセージ

なし

該当のソースコード

MainWindow.xmal

xaml

1<Window x:Class="WpfApp4.MainWindow" 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:WpfApp4" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 10 11 <Window.Resources> 12 <ContextMenu x:Key="TextBoxContextMenu"> 13 <MenuItem Command="ApplicationCommands.Copy" /> 14 <MenuItem Command="ApplicationCommands.Cut" /> 15 <MenuItem Command="ApplicationCommands.Paste" /> 16 <MenuItem Click="DelMenuItem_Click" Header="削除" /> 17 </ContextMenu> 18 19 <Style x:Key="TextBoxStyle" TargetType="{x:Type local:TextBoxEx}"> 20 <Setter Property="AcceptsReturn" Value="True" /> 21 <Setter Property="AcceptsTab" Value="True" /> 22 <Setter Property="Background" Value="{x:Null}" /> 23 <Setter Property="BorderBrush" Value="{x:Null}" /> 24 <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" /> 25 <Setter Property="FontSize" Value="16px" /> 26 <Setter Property="FontWeight" Value="bold" /> 27 <Setter Property="Foreground" Value="Red" /> 28 <Setter Property="Text" Value="テキスト" /> 29 <Setter Property="TextWrapping" Value="Wrap" /> 30 <Setter Property="Template"> 31 <Setter.Value> 32 <ControlTemplate TargetType="{x:Type TextBox}"> 33 <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True"> 34 <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" /> 35 </Border> 36 <ControlTemplate.Triggers> 37 <Trigger Property="IsMouseOver" Value="true"> 38 <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" /> 39 </Trigger> 40 <Trigger Property="IsFocused" Value="true"> 41 <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" /> 42 </Trigger> 43 </ControlTemplate.Triggers> 44 </ControlTemplate> 45 </Setter.Value> 46 </Setter> 47 </Style> 48 </Window.Resources> 49 50 <Grid> 51 <Grid.ColumnDefinitions> 52 <ColumnDefinition/> 53 <ColumnDefinition/> 54 55 </Grid.ColumnDefinitions> 56 57 58 <StackPanel Orientation="Vertical"> 59 <Button x:Name="button" Content="押してください" Click="button_Click"/> 60 <Button x:Name="button_open" Content="開く" Click="button_open_Click"/> 61 </StackPanel> 62 63 64 65 <Canvas Grid.Column="1" x:Name="canvas" MouseLeftButtonDown="Canvas_MouseLeftButtonDown"> 66 <Image Source="Resources/noimage.png" Grid.Column="1" Height="321" Width="222" Canvas.Top="51" x:Name="imageBox" Canvas.Left="93"/> 67 </Canvas> 68 69 70 71 72 73 </Grid> 74 75 76 77 78</Window> 79

MainWindow.xaml.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Navigation; 14using System.Windows.Shapes; 15using Microsoft.Win32; 16using System.IO; 17using System.ComponentModel; 18 19namespace WpfApp4 20{ 21 /// <summary> 22 /// MainWindow.xaml の相互作用ロジック 23 /// </summary> 24 public partial class MainWindow : Window 25 { 26 public string FilePath = null; 27 public MainWindow() => InitializeComponent(); 28 29 30 31 32 33 34 35 36 //objectを設定 37 public void TextBox_GotFocus(object sender, RoutedEventArgs e) 38 { 39 AdditionalWindow additionalWindow = new AdditionalWindow(); 40 additionalWindow.propertyGrid.SelectedObject = sender; 41 } 42 43 44 45 46 47 48 49 //ファイルを開く 50 private void button_open_Click(object sender, RoutedEventArgs e) 51 { 52 OpenFileDialog openFileDialog = new OpenFileDialog(); 53 if (openFileDialog.ShowDialog() == true) 54 { 55 FilePath = openFileDialog.FileName; 56 } 57 BitmapImage bitmapImage = new BitmapImage(new Uri(FilePath)); 58 59 imageBox.Source = bitmapImage; 60 } 61 62 63 64 65 66 67 private void button_Click(object sender, RoutedEventArgs e) 68 { 69 AdditionalWindow additionalWindow = new AdditionalWindow(); 70 additionalWindow.Show(); 71 additionalWindow.Owner = this; 72 73 74 75 76 77 78 } 79 80 81 private void DelMenuItem_Click(object sender, RoutedEventArgs e) 82 { 83 AdditionalWindow additionalWindow = new AdditionalWindow(); 84 MainWindow mainWindow = new MainWindow(); 85 86 if (sender is MenuItem menuItem) 87 { 88 if (menuItem.Parent is ContextMenu contextMenu) 89 { 90 if (contextMenu.PlacementTarget is TextBoxEx textBox) 91 { 92 additionalWindow.propertyGrid.SelectedObject = null; 93 textBox.GotFocus -= TextBox_GotFocus; 94 mainWindow.canvas.Children.Remove(textBox); 95 } 96 } 97 } 98 99 } 100 101 102 103 private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 104 { 105 if (e.ClickCount == 2) 106 { 107 var textBox = new TextBoxEx 108 { 109 Style = FindResource("TextBoxStyle") as Style, 110 CanvasLeft = e.GetPosition(canvas).X, 111 CanvasTop = e.GetPosition(canvas).Y 112 }; 113 textBox.GotFocus += TextBox_GotFocus; 114 canvas.Children.Add(textBox); 115 } 116 } 117 } 118} 119

AdditionalWindow.xaml

xaml

1<Window x:Class="WpfApp4.AdditionalWindow" 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:WpfApp4" 7 mc:Ignorable="d" 8 xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 9 Title="AdditionalWindow" Height="300" Width="300"> 10 11 12 13 14 <Grid> 15 16 17 <xctk:PropertyGrid x:Name="propertyGrid"/> 18 19 20 </Grid> 21</Window> 22

AdditionalWindow.xaml.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Shapes; 14using System.IO; 15using Microsoft.Win32; 16 17namespace WpfApp4 18{ 19 20 21 public class TextBoxEx : TextBox 22 { 23 public static readonly DependencyProperty CanvasLeftProperty 24 = DependencyProperty.Register(nameof(CanvasLeft), typeof(double), typeof(TextBoxEx), 25 new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasLeftChanged))); 26 public double CanvasLeft { get => (double)GetValue(CanvasLeftProperty); set => SetValue(CanvasLeftProperty, value); } 27 private static void OnCanvasLeftChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 28 { 29 if (obj is TextBoxEx ctrl) Canvas.SetLeft(ctrl, ctrl.CanvasLeft); 30 } 31 32 //Canvas.Topをラップ 33 public static readonly DependencyProperty CanvasTopProperty 34 = DependencyProperty.Register(nameof(CanvasTop), typeof(double), typeof(TextBoxEx), 35 new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasTopChanged))); 36 public double CanvasTop { get => (double)GetValue(CanvasTopProperty); set => SetValue(CanvasTopProperty, value); } 37 private static void OnCanvasTopChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 38 { 39 if (obj is TextBoxEx ctrl) Canvas.SetTop(ctrl, ctrl.CanvasTop); 40 } 41 } 42 43 /// <summary> 44 /// AdditionalWindow.xaml の相互作用ロジック 45 /// </summary> 46 public partial class AdditionalWindow : Window 47 { 48 public AdditionalWindow() => InitializeComponent(); 49 50 51 52 53 54 55 56 57 } 58} 59

どうかご教授よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

new AdditionalWindow()new MainWindow()が散見されますが、RyosukeKamimuraさんが意図している動作ではないと思います。

newするということは別のウィンドウを作るということです。操作しようとしているものとは別のインスタンスです。
AdditionalWindowが複数出る必要がない場合、ひとつだけnewし表示非表示で管理すると楽です。

あと https://teratail.com/questions/233943PropertyGridを使ったのは単にUIを作るのがだるかったからですが、自分で言うのもなんですが使いにくくないですか?^^;

IntegerUpDownとかColorPickerでUIを作っていただくのがベストですが、自分でもイライラしたのでPropertyGridを少々改良しました。

変更したファイルのみ

cs:MainWindow.xaml.cs

1using System; 2using System.Windows; 3using System.Windows.Controls; 4using System.Windows.Input; 5using System.Windows.Media; 6using System.Windows.Media.Imaging; 7using Microsoft.Win32; 8 9namespace WpfApp4 10{ 11 public partial class MainWindow : Window 12 { 13 public string FilePath = null; 14 15 private AdditionalWindow additionalWindow = new AdditionalWindow(); 16 17 18 public MainWindow() => InitializeComponent(); 19 20 21 private void button_Click(object sender, RoutedEventArgs e) 22 { 23 additionalWindow.Show(); 24 additionalWindow.Owner = this; 25 } 26 27 private void button_open_Click(object sender, RoutedEventArgs e) 28 { 29 OpenFileDialog openFileDialog = new OpenFileDialog(); 30 if(openFileDialog.ShowDialog() == true) 31 { 32 FilePath = openFileDialog.FileName; 33 BitmapImage bitmapImage = new BitmapImage(new Uri(FilePath)); 34 imageBox.Source = bitmapImage; 35 } 36 } 37 38 private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 39 { 40 if(e.ClickCount == 2) 41 { 42 var textBox = new TextBoxEx 43 { 44 Style = FindResource("TextBoxStyle") as Style, 45 CanvasLeft = e.GetPosition(canvas).X, 46 CanvasTop = e.GetPosition(canvas).Y, 47 Foreground = new SolidColorBrush(Colors.Red), // 雑い^^; 48 Background = new SolidColorBrush(), 49 }; 50 textBox.GotFocus += TextBox_GotFocus; 51 canvas.Children.Add(textBox); 52 } 53 } 54 55 private void DelMenuItem_Click(object sender, RoutedEventArgs e) 56 { 57 if(sender is MenuItem menuItem) 58 { 59 if(menuItem.Parent is ContextMenu contextMenu) 60 { 61 if(contextMenu.PlacementTarget is TextBoxEx textBox) 62 { 63 additionalWindow.propertyGrid.SelectedObject = null; 64 textBox.GotFocus -= TextBox_GotFocus; 65 canvas.Children.Remove(textBox); 66 } 67 } 68 } 69 } 70 71 private void TextBox_GotFocus(object sender, RoutedEventArgs e) 72 { 73 additionalWindow.propertyGrid.SelectedObject = sender; 74 } 75 } 76}

xml:AdditionalWindow.xaml

1<Window 2 x:Class="WpfApp4.AdditionalWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 6 Title="AdditionalWindow" 7 Width="350" 8 Height="450" 9 Closing="Window_Closing"> 10 <Grid> 11 <xctk:PropertyGrid 12 x:Name="propertyGrid" 13 AutoGenerateProperties="False" 14 ShowSearchBox="False" 15 ShowSortOptions="False" 16 ShowSummary="False" 17 ShowTitle="False"> 18 <xctk:PropertyGrid.EditorDefinitions> 19 <xctk:EditorDefinition> 20 <xctk:EditorDefinition.PropertiesDefinitions> 21 <xctk:PropertyDefinition Name="Background" /> 22 <xctk:PropertyDefinition Name="Foreground" /> 23 </xctk:EditorDefinition.PropertiesDefinitions> 24 <xctk:EditorDefinition.EditorTemplate> 25 <DataTemplate> 26 <xctk:ColorPicker SelectedColor="{Binding Value.Color}" /> 27 </DataTemplate> 28 </xctk:EditorDefinition.EditorTemplate> 29 </xctk:EditorDefinition> 30 </xctk:PropertyGrid.EditorDefinitions> 31 32 <xctk:PropertyGrid.PropertyDefinitions> 33 <xctk:PropertyDefinition Name="CanvasLeft" /> 34 <xctk:PropertyDefinition Name="CanvasTop" /> 35 <xctk:PropertyDefinition Name="Text" /> 36 <xctk:PropertyDefinition Name="Background" /> 37 <xctk:PropertyDefinition Name="FontFamily" /> 38 <xctk:PropertyDefinition Name="FontSize" /> 39 <xctk:PropertyDefinition Name="FontStretch" /> 40 <xctk:PropertyDefinition Name="FontStyle" /> 41 <xctk:PropertyDefinition Name="FontWeight" /> 42 <xctk:PropertyDefinition Name="Foreground" /> 43 </xctk:PropertyGrid.PropertyDefinitions> 44 </xctk:PropertyGrid> 45 </Grid> 46</Window>

cs:AdditionalWindow.xaml.cs

1using System.ComponentModel; 2using System.Windows; 3 4namespace WpfApp4 5{ 6 public partial class AdditionalWindow : Window 7 { 8 public AdditionalWindow() => InitializeComponent(); 9 10 private void Window_Closing(object sender, CancelEventArgs e) 11 { 12 // 閉じずに非表示にする 13 e.Cancel = true; 14 Hide(); 15 } 16 } 17}

投稿2020/01/29 10:19

編集2023/07/18 21:57
TN8001

総合スコア9317

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

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

退会済みユーザー

退会済みユーザー

2020/01/29 12:09

丁寧な回答ありがとうございます。 とても勉強になります。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/01/29 12:09

プログラミングの関連の質問とは異なるのですが、 また、TN8001さんのようなすごいプログラマーになるためには何か特別なことをされましたか?参考になるサイトまたは、本などありましたら教えていただけないでしょうか? どうか教えていただきたいです。 よろしくお願いします。m(__)m
TN8001

2020/01/29 12:30

趣味でやっているだけなのでアマチュアです。歴は無駄に長いですが中級程度じゃないでしょうか。 xamlに関しては見た目にこだわってしまうほうなので、かなり詳しくなってしまいました。 本はほとんど持っていません。もっぱらGoogle検索です。 日本語でヒットしなければ他言語のページを見ることになりますが、C#やxamlならGoogle翻訳で十分わかります。 ここで書くのもなんですが^^; 最後は https://stackoverflow.com/ で解決することが多いですね。 ググり力(キーワードの選択スキル)は確かに関係すると思いますが、どうやって上げるかというとなかなか難しいですね。。。
退会済みユーザー

退会済みユーザー

2020/01/30 01:11

Google検索で解決されているのは、驚きです! 僕もなるべくStackoverflowを参考にしていきたいと思います! ありがとうございます m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問