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

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

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

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

WPF

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

Q&A

解決済

2回答

1970閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

0クリップ

投稿2020/01/29 05:56

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

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

以下のコードはMainWindow.xaml

MainWindow.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 80

以下MainWindow.xaml.csです

MainWindow.xaml.cs

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 public class TextBoxEx : TextBox 33 { 34 public static readonly DependencyProperty CanvasLeftProperty 35 = DependencyProperty.Register(nameof(CanvasLeft), typeof(double), typeof(TextBoxEx), 36 new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasLeftChanged))); 37 public double CanvasLeft { get => (double)GetValue(CanvasLeftProperty); set => SetValue(CanvasLeftProperty, value); } 38 private static void OnCanvasLeftChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 39 { 40 if (obj is TextBoxEx ctrl) Canvas.SetLeft(ctrl, ctrl.CanvasLeft); 41 } 42 43 //Canvas.Topをラップ 44 public static readonly DependencyProperty CanvasTopProperty 45 = DependencyProperty.Register(nameof(CanvasTop), typeof(double), typeof(TextBoxEx), 46 new FrameworkPropertyMetadata(0d, new PropertyChangedCallback(OnCanvasTopChanged))); 47 public double CanvasTop { get => (double)GetValue(CanvasTopProperty); set => SetValue(CanvasTopProperty, value); } 48 private static void OnCanvasTopChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 49 { 50 if (obj is TextBoxEx ctrl) Canvas.SetTop(ctrl, ctrl.CanvasTop); 51 } 52 } 53 54 55 56 //objectを設定 57 public void TextBox_GotFocus(object sender, RoutedEventArgs e) 58 { 59 AdditionalWindow additionalWindow = new AdditionalWindow(); 60 additionalWindow.propertyGrid.SelectedObject = sender; 61 } 62 63 64 65 66 67 68 69 //ファイルを開く挙動 70 private void button_open_Click(object sender, RoutedEventArgs e) 71 { 72 OpenFileDialog openFileDialog = new OpenFileDialog(); 73 if (openFileDialog.ShowDialog() == true) 74 { 75 FilePath = openFileDialog.FileName; 76 } 77 BitmapImage bitmapImage = new BitmapImage(new Uri(FilePath)); 78 79 imageBox.Source = bitmapImage; 80 } 81 82 83 84 85 //テキストを追加する 86 private void button_Click(object sender, RoutedEventArgs e) 87 { 88 AdditionalWindow additionalWindow = new AdditionalWindow(); 89 additionalWindow.Show(); 90 additionalWindow.Owner = this; 91 92 93 94 95 96 97 } 98 99 100 private void DelMenuItem_Click(object sender, RoutedEventArgs e) 101 { 102 AdditionalWindow additionalWindow = new AdditionalWindow(); 103 MainWindow mainWindow = new MainWindow(); 104 105 if (sender is MenuItem menuItem) 106 { 107 if (menuItem.Parent is ContextMenu contextMenu) 108 { 109 if (contextMenu.PlacementTarget is TextBoxEx textBox) 110 { 111 additionalWindow.propertyGrid.SelectedObject = null; 112 textBox.GotFocus -= TextBox_GotFocus; 113 mainWindow.canvas.Children.Remove(textBox); 114 } 115 } 116 } 117 118 } 119 120 121 122 private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 123 { 124 if (e.ClickCount == 2) 125 { 126 var textBox = new TextBoxEx 127 { 128 Style = FindResource("TextBoxStyle") as Style, 129 CanvasLeft = e.GetPosition(canvas).X, 130 CanvasTop = e.GetPosition(canvas).Y 131 }; 132 textBox.GotFocus += TextBox_GotFocus; 133 canvas.Children.Add(textBox); 134 } 135 } 136 } 137} 138

以下はAdditionalWindow.xamlです。

AdditionalWindow.xaml

1 2<Window 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:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:local="clr-namespace:WpfApp4" 8 mc:Ignorable="d" 9 xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 10 Title="AdditionalWindow" Height="300" Width="300"> 11 12 13 14 15 <Grid> 16 17 18 <xctk:PropertyGrid x:Name="propertyGrid"/> 19 20 21 </Grid> 22</Window> 23 24

以下は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で質問しました。

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

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

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

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

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

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

TN8001

2020/01/29 10:37

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

回答2

0

ベストアンサー

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

投稿2020/01/29 07:15

hihijiji

総合スコア4150

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

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

退会済みユーザー

退会済みユーザー

2020/01/29 08:02

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

0

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

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

投稿2020/01/29 06:28

y_waiwai

総合スコア87747

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

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

退会済みユーザー

退会済みユーザー

2020/01/29 08:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問