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

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

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

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

WPF

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

Q&A

解決済

1回答

3352閲覧

【C#】WPFでImageコントロールをまとめて操作したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

1グッド

0クリップ

投稿2020/09/16 09:32

前提・実現したいこと

ImageのコントロールをVisible、Hiddenで切り替えて表示してます。
大量のImageを切り替えたいと思っているのですが
If文で毎回実行していくのも違うと思い、いい方法がないか調べてます。

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

・Imageコントロールを総当たりする方法が分からない
・Imageコントロールのx:Nameの値で比較して操作したい
(特定名のイメージを操作したい)

該当のソースコード

現状は、ボタンを押すとImage1が表示され、
ボタン2を押すとImage2が表示されます。

xaml

1<Window x:Class="WpfApp3.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:WpfApp3" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <Image x:Name="Image1" Source="pic/1.png" Visibility="Hidden" /> 11 <Image x:Name="Image2" Source="pic/2.png" Visibility="Hidden" /> 12 <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 13 <Button Content="Button2" HorizontalAlignment="Left" Margin="75,0,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click2"/> 14 </Grid> 15</Window> 16

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; 15 16namespace WpfApp3 17{ 18 /// <summary> 19 /// MainWindow.xaml の相互作用ロジック 20 /// </summary> 21 public partial class MainWindow : Window 22 { 23 public MainWindow() 24 { 25 InitializeComponent(); 26 } 27 28 private void Button_Click(object sender, RoutedEventArgs e) 29 { 30 Image1.Visibility = Visibility.Visible; 31 Image2.Visibility = Visibility.Hidden; 32 } 33 34 private void Button_Click2(object sender, RoutedEventArgs e) 35 { 36 Image1.Visibility = Visibility.Hidden; 37 Image2.Visibility = Visibility.Visible; 38 } 39 } 40} 41

試したこと

C#

1this.Controls["label1"].Text = "HIRO";

上記と同じように
this.Controls["Image1"].Visibility = Visibility.Visible;
としてみましたが、Controlsが定義に含まれていないと
エラーが出て上手くいきませんでした。

C#

1 foreach (var child in MyGrid.Children) 2 { 3 if (child.Name == "Image1") { 4 5 } 6 //do something with child 7 }

Gridに「x:Name="MyGrid"」と名前を付け、Childernとすることで
Imageのコントロールが取得出来ているような気がしますが、操作方法が分かりません。

お手数をおかけしますが、回答のほどよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Windows10
VisualStudio2019
.NET4.5

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

this.Controls["label1"].Text = "HIRO";

この書き方はWindows FormsのものですのでWPFでは使えません。

例えばこんな感じでMyGridであれば、まとめて切り替えられます。

cs

1using System.Linq; 2using System.Windows; 3using System.Windows.Controls; 4 5namespace Questions292270 6{ 7 public partial class MainWindow : Window 8 { 9 public MainWindow() 10 { 11 InitializeComponent(); 12 } 13 14 private void Button_Click(object sender, RoutedEventArgs e) 15 { 16 ToggleImage(Image1); 17 } 18 19 private void Button_Click2(object sender, RoutedEventArgs e) 20 { 21 ToggleImage(Image2); 22 } 23 24 private void ToggleImage(Image image) 25 { 26 // MyGridの子のうちImageだけを列挙 27 foreach(Image i in MyGrid.Children.OfType<Image>()) 28 { 29 // Nameで比較してもいいのですが打ち間違えたりするので、直接比較したほうがミスがない 30 if(image == i) 31 { 32 i.Visibility = Visibility.Visible; 33 } 34 else 35 { 36 i.Visibility = Visibility.Hidden; 37 } 38 } 39 } 40 } 41}

WindowのすべてのImageを列挙したい」ような場合は、VisualTreeHelperを使います。
VisualTreeHelper クラス (System.Windows.Media) | Microsoft Docs

参考 VisualTreeの子孫要素を取得する - xin9le.net

ほかにもいろいろ方法はありそうですが、もう少し具体的な例でないと何とも言えませんね^^;

投稿2020/09/16 10:55

編集2023/08/12 09:49
TN8001

総合スコア9326

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

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

退会済みユーザー

退会済みユーザー

2020/09/17 00:56

TN8001様、回答ありがとうございます! WPFで調べているのに、見つかるのは毎回WindowsFormのほうなんですよね…。 頂いたソースコードで完璧に動きました! Nameで比較したかったので、ソースを部分変更しましたが 問題なく動いたのでホッとしております。 WindowすべてのImageを列挙したいと記載しましたが、 Gridなど範囲を限定しても動作に問題ない為、このまま利用しようと思います! たぶん、また質問させて頂くかと思いますが その際もお時間に余裕があれば回答をお願いいたします。 毎回ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問