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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

Q&A

解決済

2回答

2952閲覧

引数のSystem.Windows.UIElementをstringで指定する方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

0グッド

0クリップ

投稿2020/10/08 07:18

前提

WPFでアプリを作っています。
Grid上の要素をドラッグアンドドロップで移動させるのですが、その際に使う関数にSystem.Windows.UIElementを引数にとるものがあります。
たとえば、以下の関数です。

public static void SetRow (System.Windows.UIElement element, int value);

この関数は、xaml上で"hoge"というNameを設定している要素があるとすると、
SetRow(hoge,[任意の数])
という書き方をすると期待通りの動作をしてくれます。

実現したいこと

上記の"hoge"のように直接使いたい要素のNameを関数に書くのではなく、一度そのNameをstring型変数に保存したうえでその変数を渡したいです。
しかしそれをすると、以下のようなエラーが表示されます。

引数1:は'string'から'System.Windows.UIElement'へ変換することはできません。

このエラーを取り除く方法はないでしょうか。

あるいは、Name以外に要素を指定する方法があればstringを使う必要はないのかもしれません。
コードなしだと伝わりにくいと思いますが、やりたいのは
「クリックしたセル内の要素を取得し、それを上記のような関数に渡してD&D操作を実現する」
というようなことです。
関数に直接Nameを記入するのではなく、クリックした要素を一度保持して、それを引数に渡すことができる方法があればそれで構わないです。

ご回答よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

こんにちは。またお会いしましたね。

WPFのコントロールをNameプロパティから検索したいということでしょうか。
それでしたら、FrameworkElement.FindNameメソッドがご要望の通りのものになると思います。

C#

1public class MainWindow : Window 2{ 3 public MainWindow() 4 { 5 InitializeComponent(); 6 // WindowクラスはFrameworkElementなので、以下のように書けばOK。「this.」は省略出来ますが、直感的な理解のしやすさから書く人もいるみたいです。 7 var control = this.FindName("Name of control"); 8 } 9}

##追記
選択されたコントロールを一時的に保持しておきたいということであれば、単にUIElementかFrameworkElementかのフィールドを作って保持しておけば良いのではないでしょうか。
コントロールが選択されたことを取得するのにEventHandler系を利用しているのであれば、引数のsenderにそのコントロールが代入されていますので、それを適切にキャストしてやればOKです。

ところで、Gridの中身を動的に変更したい場合はDataGridを使えばMVVM感のある綺麗なコードが書けると聞いたことがあります。
「WPF DataGrid ドラッグドロップ」などで検索をかけてみて下さい。

投稿2020/10/08 08:07

編集2020/10/08 08:19
Automatic9045

総合スコア313

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

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

退会済みユーザー

退会済みユーザー

2020/10/08 08:44

度々ありがとうございます。 記載いただいたFindNameメソッドを使ってもうまくいかなかった(やりたいことと違った)のですが、その対応中に偶然自己解決してしまいました。 内容は追記に記載いただいた方法と同様なのでベストアンサーを差し上げたかったのですが、入れ違いになってしまい申し訳ないです。 DataGridいいですね。ふつうのGridではちょっと行き詰まりもあったので調べてみます。
guest

0

ベストアンサー

Thumbというコントロールを使っていたのですが、string型にそのNameプロパティを代入するのではなく、System.Windows.Controls.Primitives.Thumb型の変数にobjectを代入すればうまくいきました。

private void mark_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e) { System.Windows.Controls.Primitives.Thumb clickedthumb clickedthumb= (System.Windows.Controls.Primitives.Thumb)sender; Grid.SetRow(clickedCell, [任意の数]); }

用語などよくわかっていない部分が多いので解決法として記載できるのは上記が精一杯ですが、
System.Windows.UIElementという型を指定されていたところに、使うコントロールに合わせたSystem.Windows.Controls.Primitives.Thumbという型を指定すればうまくいったという形になります。

投稿2020/10/08 08:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問