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

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回答

2001閲覧

[WPF]BindingのPath内に変化する値を入れる方法

退会済みユーザー

退会済みユーザー

総合スコア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/09 05:28

###実現したいこと
WPFで2*2のGrid内に画像を表示します。
画像のURLをコードビハインドで2次元配列(っぽい)インデクサのIndexer[x,y]で定義しており、それを下のxamlコードでBindingして表示しようとしています。

各セルに配置しているThumb要素はControlTemplateとStyleを使ってImageとして表示しています。
このTemplateの中のImage要素にIndexer[x,y]からとってきたURLをBindingしようとしているのですが、このx,yにThumbコントロールそれぞれに設定しているRow・Columnの値を設定したいです。

Indexer[x,y]には2*2=4種類の画像のURLを保持していると考えてください。
上記のように設定できれば、Gridのセルそれぞれに1種類ずつ、計4種類の画像が表示されることになります。

BindingのPath内に、Row・Columnのような適用先によって変化する値を設定することは可能でしょうか?

xaml

1<Window x:Class="ThumbTest.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:ThumbTest" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid x:Name="BoardGrid" HorizontalAlignment="Center" Margin="0,0,0.0,0" VerticalAlignment="Bottom" ShowGridLines="True" Height="300" Width="360" Grid.ColumnSpan="4" Opacity="0.985"> 10 <Grid.ColumnDefinitions> 11 <ColumnDefinition Width="*"/> 12 <ColumnDefinition Width="*"/> 13 </Grid.ColumnDefinitions> 14 <Grid.RowDefinitions> 15 <RowDefinition Height="*"/> 16 <RowDefinition Height="*"/> 17 </Grid.RowDefinitions> 18 <Grid.Resources> 19 <ControlTemplate x:Key="ThumbTmplate" TargetType="Thumb"> 20 <Image Source= "{Binding Path=Indexer[x\,y]}" /> 21 <!--↑このx,yに下のThumbコントロールそれぞれに設定しているRow・Columnの値を設定したい--> 22 </ControlTemplate> 23 <Style TargetType="{x:Type Thumb}"> 24 <Setter Property="Template" Value="{StaticResource ThumbTmplate}"/> 25 </Style> 26 </Grid.Resources> 27 <Thumb Name="GridCell0_0" Grid.Row="0" Grid.Column="0" 28 DragCompleted="mark_DragCompleted" 29 DragStarted="mark_DragStarted" 30 DragDelta="mark_DragDelta" 31 > 32 </Thumb> 33 <Thumb Name="GridCell0_1" Grid.Row="0" Grid.Column="1" 34 DragCompleted="mark_DragCompleted" 35 DragStarted="mark_DragStarted" 36 DragDelta="mark_DragDelta" 37 > 38 </Thumb> 39 <Thumb Name="GridCell1_0" Grid.Row="1" Grid.Column="0" 40 DragCompleted="mark_DragCompleted" 41 DragStarted="mark_DragStarted" 42 DragDelta="mark_DragDelta" 43 > 44 </Thumb> 45 <Thumb Name="GridCell1_1" Grid.Row="1" Grid.Column="1" 46 DragCompleted="mark_DragCompleted" 47 DragStarted="mark_DragStarted" 48 DragDelta="mark_DragDelta" 49 > 50 </Thumb> 51 </Grid> 52</Window>

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

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

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

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

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

guest

回答2

0

ベストアンサー

単純にやるとするとコンバータでしょうかねぇ?
Image.Sourceに文字列をバインドした場合ImageSourceに自動変換されますが、自前のコンバータを入れるとそこもやることになります。

めちゃくちゃ雑ですが、こんな雰囲気です。

xml

1<Window 2 x:Class="Questions296905.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Questions296905" 6 Width="800" 7 Height="450"> 8 <Grid 9 Width="360" 10 Height="300" 11 ShowGridLines="True"> 12 <Grid.ColumnDefinitions> 13 <ColumnDefinition /> 14 <ColumnDefinition /> 15 </Grid.ColumnDefinitions> 16 <Grid.RowDefinitions> 17 <RowDefinition /> 18 <RowDefinition /> 19 </Grid.RowDefinitions> 20 <Grid.Resources> 21 <local:IndexerConverter x:Key="IndexerConverter" /> 22 <ControlTemplate x:Key="ThumbTmplate" TargetType="Thumb"> 23 <Image> 24 <Image.Source> 25 <MultiBinding Converter="{StaticResource IndexerConverter}"> 26 <Binding Path="Indexer" /> 27 <Binding Path="(Grid.Column)" RelativeSource="{RelativeSource TemplatedParent}" /> 28 <Binding Path="(Grid.Row)" RelativeSource="{RelativeSource TemplatedParent}" /> 29 </MultiBinding> 30 </Image.Source> 31 </Image> 32 </ControlTemplate> 33 <Style TargetType="{x:Type Thumb}"> 34 <Setter Property="Template" Value="{StaticResource ThumbTmplate}" /> 35 <EventSetter Event="DragCompleted" Handler="mark_DragCompleted" /> 36 <EventSetter Event="DragDelta" Handler="mark_DragDelta" /> 37 <EventSetter Event="DragStarted" Handler="mark_DragStarted" /> 38 </Style> 39 </Grid.Resources> 40 <Thumb /> 41 <Thumb Grid.Column="1" /> 42 <Thumb Grid.Row="1" /> 43 <Thumb Grid.Row="1" Grid.Column="1" /> 44 </Grid> 45</Window>

cs

1using System; 2using System.Globalization; 3using System.Windows; 4using System.Windows.Controls.Primitives; 5using System.Windows.Data; 6using System.Windows.Media.Imaging; 7 8namespace Questions296905 9{ 10 public class Indexer 11 { 12 private const string A = @"https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg"; 13 private const string B = @"https://teratail-v2.storage.googleapis.com/uploads/avatars/u14/143281/4935fb53e9921aff_thumbnail.jpg"; 14 private readonly string[,] inner = new string[,] { { A, B, }, { B, A, } }; 15 16 public string this[int X, int Y] { set => inner[X, Y] = value; get => inner[X, Y]; } 17 } 18 19 public class IndexerConverter : IMultiValueConverter 20 { 21 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 22 { 23 var indexer = values[0] as Indexer; 24 return new BitmapImage(new Uri(indexer[(int)values[1], (int)values[2]])); 25 } 26 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException(); 27 } 28 29 public partial class MainWindow : Window 30 { 31 public Indexer Indexer { get; } = new Indexer(); 32 33 public MainWindow() 34 { 35 InitializeComponent(); 36 DataContext = this; 37 } 38 39 private void mark_DragCompleted(object sender, DragCompletedEventArgs e) { } 40 private void mark_DragDelta(object sender, DragDeltaEventArgs e) { } 41 private void mark_DragStarted(object sender, DragStartedEventArgs e) { } 42 } 43}

画像がマス目に配置されて入れ替えたりをされていると思うのですが、

  • マス目は同じサイズ
  • 空いたマスがない
  • 画像は重ならない

ならばUniformGridが向いています。

そうでない場合Gridになるかと思いますが、ピース側にXYを持たせてバインドのほうが筋がいいかもしれません。

アニメーション等動きがある場合、Canvasベースのほうが作りやすいかもしれません。

投稿2020/10/09 09:04

編集2023/08/12 14:41
TN8001

総合スコア9862

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

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

退会済みユーザー

退会済みユーザー

2020/10/09 12:56 編集

ありがとうございます。 月曜まで環境が手元にないので確認は出来ないですが、コンバーターを使えばいけそうですね。わかりやすいコードを付けていただいて助かります。 >ピース側にXYを持たせてバインドのほうが筋がいいかもしれません。 これはGridのRowとColumnを取ってきてインデクサに渡すのではなく、インデクサ(Indexer[x][y])側で設定しているx,yをそれぞれGridのRowとColumnに渡す方がいいということですよね。 確かにそう思い始めました。 あと、ちょうど動かすときにアニメーションをつけたいと思っていたので、GridではなくCanvasを使う方法もあるかもしれませんね。時間との兼ね合いもありますが、ちょっと検討してみます。 (恥ずかしながらまだ勉強し始めで、Canvasというものを知ったのも今日が初めてだったもので、Grid以外の方法を考えてもいませんでした。。) 質問文に書いていない要件まで満たせそうで、本当に感謝です。 ありがとうございます。
guest

0

質問の意図とは異なるかもしれませんが
こうして

xaml

1 <ControlTemplate x:Key="ThumbTmplate" TargetType="Thumb"> 2 <Image Source= "{Binding}" /> 3 </ControlTemplate>

こう

xaml

1 <Thumb DataContext="{Binding Path=Indexer[0\,0]}" 2 Name="GridCell0_0" Grid.Row="0" Grid.Column="0" 3 DragCompleted="mark_DragCompleted" 4 DragStarted="mark_DragStarted" 5 DragDelta="mark_DragDelta" 6 > 7 </Thumb>

ではだめですか?

投稿2020/10/10 04:11

ikarimame

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問