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

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

ただいまの
回答率

89.20%

local:TextBoxExが見つかりません。というエラーについて

解決済

回答 2

投稿

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

エラーコード本文について

'local:TextBoxEx'が見つかりません。型名では、大文字と小文字が区別されることに注意してください。

以下のコードはMainWindow.xaml

<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();




        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);
            }
        }



        //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
{

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








    }
}

コードの説明

WPFで画像のなかにTextBoxを入れる機能を追加しようとしています。2つのウィンドウに分けて実装しようとしています。

自分なりに取り組んだこと

解決方法がないかググったのですが、なかなか解決方法に結びつくことができなかったあためteratailで質問しました。

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • TN8001

    2020/01/29 19:37

    通常はTextBoxEx.csにclass TextBoxExを記述します。
    元々私がまとめて記述していたのがよくなかったですね^^;

    キャンセル

回答 2

checkベストアンサー

0

TextBoxExクラスがMainWindowクラスの中に入ってます。
C#ではその書き方は一般的ではなく、あまり用途がありません。
しいて言えばMainWindowクラス以外からは使いたくない場合ぐらいですが、
制限がつけられる訳ではないのでメリットがあまりありません。
そしてその状態だと、local:TextBoxEx では指定できません。
TextBoxExクラスをMainWindowクラスの外に出してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/29 17:02

    ありがとうございます。
    よくわかりました。

    キャンセル

0

  if (obj is TextBoxEx ctrl) Canvas.SetLeft(ctrl, ctrl.CanvasLeft);

ちと意味不明の記述になってますが、なにを意図されてますか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/29 17:03

    Canvasコントロール内に新しくTextBoxコントロールを追加する際にCanvasの位置を設定するためです。

    キャンセル

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

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