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

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

ただいまの
回答率

89.19%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 396

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

コードの説明

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

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

なし

 

該当のソースコード

MainWindow.xmal

<Window x:Class="WpfApp4.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:WpfApp4"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">


    <Window.Resources>
        <ContextMenu x:Key="TextBoxContextMenu">
            <MenuItem Command="ApplicationCommands.Copy" />
            <MenuItem Command="ApplicationCommands.Cut" />
            <MenuItem Command="ApplicationCommands.Paste" />
            <MenuItem Click="DelMenuItem_Click" Header="削除" />
        </ContextMenu>

        <Style x:Key="TextBoxStyle" TargetType="{x:Type local:TextBoxEx}">
            <Setter Property="AcceptsReturn" Value="True" />
            <Setter Property="AcceptsTab" Value="True" />
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
            <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
            <Setter Property="FontSize" Value="16px" />
            <Setter Property="FontWeight" Value="bold" />
            <Setter Property="Foreground" Value="Red" />
            <Setter Property="Text" Value="テキスト" />
            <Setter Property="TextWrapping" Value="Wrap" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
                            <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" />
                            </Trigger>
                            <Trigger Property="IsFocused" Value="true">
                                <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>

        </Grid.ColumnDefinitions>


        <StackPanel Orientation="Vertical">
            <Button x:Name="button" Content="押してください" Click="button_Click"/>
            <Button x:Name="button_open" Content="開く" Click="button_open_Click"/>
        </StackPanel>



        <Canvas Grid.Column="1" x:Name="canvas" MouseLeftButtonDown="Canvas_MouseLeftButtonDown">
            <Image Source="Resources/noimage.png" Grid.Column="1" Height="321" Width="222" Canvas.Top="51" x:Name="imageBox" Canvas.Left="93"/>
        </Canvas>





    </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;
using Microsoft.Win32;
using System.IO;
using System.ComponentModel;

namespace WpfApp4
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public string FilePath = null;
        public MainWindow() => InitializeComponent();








        //objectを設定
        public void TextBox_GotFocus(object sender, RoutedEventArgs e)
        {
            AdditionalWindow additionalWindow = new AdditionalWindow();
            additionalWindow.propertyGrid.SelectedObject = sender;
        }







        //ファイルを開く
        private void button_open_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == true)
            {
                FilePath = openFileDialog.FileName;
            }
            BitmapImage bitmapImage = new BitmapImage(new Uri(FilePath));

            imageBox.Source = bitmapImage;
        }






        private void button_Click(object sender, RoutedEventArgs e)
        {
            AdditionalWindow additionalWindow = new AdditionalWindow();
            additionalWindow.Show();
            additionalWindow.Owner = this;






        }


        private void DelMenuItem_Click(object sender, RoutedEventArgs e)
        {
            AdditionalWindow additionalWindow = new AdditionalWindow();
            MainWindow mainWindow = new MainWindow();

            if (sender is MenuItem menuItem)
            {
                if (menuItem.Parent is ContextMenu contextMenu)
                {
                    if (contextMenu.PlacementTarget is TextBoxEx textBox)
                    {
                        additionalWindow.propertyGrid.SelectedObject = null;
                        textBox.GotFocus -= TextBox_GotFocus;
                        mainWindow.canvas.Children.Remove(textBox);
                    }
                }
            }

        }



        private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ClickCount == 2)
            {
                var textBox = new TextBoxEx
                {
                    Style = FindResource("TextBoxStyle") as Style,
                    CanvasLeft = e.GetPosition(canvas).X,
                    CanvasTop = e.GetPosition(canvas).Y
                };
                textBox.GotFocus += TextBox_GotFocus;
                canvas.Children.Add(textBox);
            }
        }
    }
}

AdditionalWindow.xaml

<Window x:Class="WpfApp4.AdditionalWindow"
        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:WpfApp4"
        mc:Ignorable="d"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        Title="AdditionalWindow" Height="300" Width="300">




    <Grid>


        <xctk:PropertyGrid x:Name="propertyGrid"/>


    </Grid>
</Window>


AdditionalWindow.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.Shapes;
using System.IO;
using Microsoft.Win32;

namespace WpfApp4
{


    public class TextBoxEx : TextBox
    {
        public static readonly DependencyProperty CanvasLeftProperty
            = DependencyProperty.Register(nameof(CanvasLeft), typeof(double), typeof(TextBoxEx),
                new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasLeftChanged)));
        public double CanvasLeft { get => (double)GetValue(CanvasLeftProperty); set => SetValue(CanvasLeftProperty, value); }
        private static void OnCanvasLeftChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            if (obj is TextBoxEx ctrl) Canvas.SetLeft(ctrl, ctrl.CanvasLeft);
        }

        //Canvas.Topをラップ
        public static readonly DependencyProperty CanvasTopProperty
            = DependencyProperty.Register(nameof(CanvasTop), typeof(double), typeof(TextBoxEx),
                new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasTopChanged)));
        public double CanvasTop { get => (double)GetValue(CanvasTopProperty); set => SetValue(CanvasTopProperty, value); }
        private static void OnCanvasTopChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            if (obj is TextBoxEx ctrl) Canvas.SetTop(ctrl, ctrl.CanvasTop);
        }
    }

    /// <summary>
    /// AdditionalWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class AdditionalWindow : Window
    {
        public AdditionalWindow() => InitializeComponent();








    }
}

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

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

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

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

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

変更したファイルのみ
MainWindow.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Win32;

namespace WpfApp4
{
    public partial class MainWindow : Window
    {
        public string FilePath = null;

        private AdditionalWindow additionalWindow = new AdditionalWindow();


        public MainWindow() => InitializeComponent();


        private void button_Click(object sender, RoutedEventArgs e)
        {
            additionalWindow.Show();
            additionalWindow.Owner = this;
        }

        private void button_open_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if(openFileDialog.ShowDialog() == true)
            {
                FilePath = openFileDialog.FileName;
                BitmapImage bitmapImage = new BitmapImage(new Uri(FilePath));
                imageBox.Source = bitmapImage;
            }
        }

        private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if(e.ClickCount == 2)
            {
                var textBox = new TextBoxEx
                {
                    Style = FindResource("TextBoxStyle") as Style,
                    CanvasLeft = e.GetPosition(canvas).X,
                    CanvasTop = e.GetPosition(canvas).Y,
                    Foreground = new SolidColorBrush(Colors.Red), // 雑い^^;
                    Background = new SolidColorBrush(),
                };
                textBox.GotFocus += TextBox_GotFocus;
                canvas.Children.Add(textBox);
            }
        }

        private void DelMenuItem_Click(object sender, RoutedEventArgs e)
        {
            if(sender is MenuItem menuItem)
            {
                if(menuItem.Parent is ContextMenu contextMenu)
                {
                    if(contextMenu.PlacementTarget is TextBoxEx textBox)
                    {
                        additionalWindow.propertyGrid.SelectedObject = null;
                        textBox.GotFocus -= TextBox_GotFocus;
                        canvas.Children.Remove(textBox);
                    }
                }
            }
        }

        private void TextBox_GotFocus(object sender, RoutedEventArgs e)
        {
            additionalWindow.propertyGrid.SelectedObject = sender;
        }
    }
}

AdditionalWindow.xaml

<Window
  x:Class="WpfApp4.AdditionalWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
  Title="AdditionalWindow"
  Width="350"
  Height="450"
  Closing="Window_Closing">
  <Grid>
    <xctk:PropertyGrid
      x:Name="propertyGrid"
      AutoGenerateProperties="False"
      ShowSearchBox="False"
      ShowSortOptions="False"
      ShowSummary="False"
      ShowTitle="False">
      <xctk:PropertyGrid.EditorDefinitions>
        <xctk:EditorDefinition>
          <xctk:EditorDefinition.PropertiesDefinitions>
            <xctk:PropertyDefinition Name="Background" />
            <xctk:PropertyDefinition Name="Foreground" />
          </xctk:EditorDefinition.PropertiesDefinitions>
          <xctk:EditorDefinition.EditorTemplate>
            <DataTemplate>
              <xctk:ColorPicker SelectedColor="{Binding Value.Color}" />
            </DataTemplate>
          </xctk:EditorDefinition.EditorTemplate>
        </xctk:EditorDefinition>
      </xctk:PropertyGrid.EditorDefinitions>

      <xctk:PropertyGrid.PropertyDefinitions>
        <xctk:PropertyDefinition Name="CanvasLeft" />
        <xctk:PropertyDefinition Name="CanvasTop" />
        <xctk:PropertyDefinition Name="Text" />
        <xctk:PropertyDefinition Name="Background" />
        <xctk:PropertyDefinition Name="FontFamily" />
        <xctk:PropertyDefinition Name="FontSize" />
        <xctk:PropertyDefinition Name="FontStretch" />
        <xctk:PropertyDefinition Name="FontStyle" />
        <xctk:PropertyDefinition Name="FontWeight" />
        <xctk:PropertyDefinition Name="Foreground" />
      </xctk:PropertyGrid.PropertyDefinitions>
    </xctk:PropertyGrid>
  </Grid>
</Window>

AdditionalWindow.xaml.cs

using System.ComponentModel;
using System.Windows;

namespace WpfApp4
{
    public partial class AdditionalWindow : Window
    {
        public AdditionalWindow() => InitializeComponent();

        private void Window_Closing(object sender, CancelEventArgs e)
        {
            // 閉じずに非表示にする
            e.Cancel = true;
            Hide();
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/29 21:09

    丁寧な回答ありがとうございます。
    とても勉強になります。
    ありがとうございます。

    キャンセル

  • 2020/01/29 21:09

    プログラミングの関連の質問とは異なるのですが、

    また、TN8001さんのようなすごいプログラマーになるためには何か特別なことをされましたか?参考になるサイトまたは、本などありましたら教えていただけないでしょうか?

    どうか教えていただきたいです。
    よろしくお願いします。m(__)m

    キャンセル

  • 2020/01/29 21:30

    趣味でやっているだけなのでアマチュアです。歴は無駄に長いですが中級程度じゃないでしょうか。
    xamlに関しては見た目にこだわってしまうほうなので、かなり詳しくなってしまいました。

    本はほとんど持っていません。もっぱらGoogle検索です。
    日本語でヒットしなければ他言語のページを見ることになりますが、C#やxamlならGoogle翻訳で十分わかります。

    ここで書くのもなんですが^^; 最後は https://stackoverflow.com/ で解決することが多いですね。

    ググり力(キーワードの選択スキル)は確かに関係すると思いますが、どうやって上げるかというとなかなか難しいですね。。。

    キャンセル

  • 2020/01/30 10:11

    Google検索で解決されているのは、驚きです!
    僕もなるべくStackoverflowを参考にしていきたいと思います!

    ありがとうございます m(__)m

    キャンセル

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

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