C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: DataTemplate内のImageの値をコードから書換


(過去ログ 60 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■34810 / inTopicNo.1)  DataTemplate内のImageの値をコードから書換
  
□投稿者/ 倉田 有大 (531回)-(2009/04/10(Fri) 10:52:47)

分類:[.NET 全般] 

2009/04/10(Fri) 11:09:36 編集(投稿者)
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WPFCustomControl">

    <HierarchicalDataTemplate DataType="{x:Type local:FLPATHTree}"  
            ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal">
            <Image Source="{Binding ImageSource}" Width="16" Height ="16" x:Name="TreeViewImage"/> //この行
            <TextBlock Text="{Binding FLPATH.FileName}"/>   
        </StackPanel>
    </HierarchicalDataTemplate>
</ResourceDictionary>




<Image Source="{Binding ImageSource}" Width="16" Height ="16" x:Name="TreeViewImage"/>
上記のWidthとHeightをコードから書き換える方法はあるでしょうか?
FLPATHTreeのプロパティーに値を持たせ、バインドさせることは可能でしたが、リソースを直接指定して書き換えることはできるのでしょうか?

this.FindName("TreeViewImage"); じゃリソースだから何も入ってきてくれないんですよねT^T

引用返信 編集キー/
■34814 / inTopicNo.2)  Re[1]: DataTemplate内のImageの値をコードから書換
□投稿者/ 囚人 (340回)-(2009/04/10(Fri) 13:21:17)
情報が少なすぎて訳分かりませんが。

DataTemplate というぐらいだから、何かのコントロールのテンプレートなんでしょけど、そのコントロールに対して

LogicalTreeHelper::FindLogicalNode

を使って名前でコントロールを取得する。
引用返信 編集キー/
■34823 / inTopicNo.3)  Re[2]: DataTemplate内のImageの値をコードから書換
□投稿者/ 倉田 有大 (533回)-(2009/04/10(Fri) 18:20:21)
囚人さん、お返事ありがとうございます。情報が少なくてすいません。未熟な物で、どこまで情報が必要かまだわからないのです。

上記はカスタムコントールを追加して追加されるGeneric.xamlファイルの内容です。
カスタムコントロールはTreViewを継承しています。
ですから、HierarchicalDataTemplateを使っています。

カスタムコントロールを使うXAMLで下記のようにリソースに読ませています。
<Window.Resources>
<ResourceDictionary Source="/Themes/Generic.xaml" />
</Window.Resources>


var v = LogicalTreeHelper.FindLogicalNode(this,"TreeViewImage");
foreach (var child in LogicalTreeHelper.GetChildren(this))
{
}

上記の2種類の方法を試してみましたが、HierarchicalDataTemplate内のImageは取得できませんでした。
メインウインドウのコントロールは見えました。

まあ、バインドしてしまえばやりたいことは出来たのですが。
引用返信 編集キー/
■34825 / inTopicNo.4)  Re[3]: DataTemplate内のImageの値をコードから書換
□投稿者/ 囚人 (341回)-(2009/04/10(Fri) 19:00:39)
その this って何ですか?「どこ」から取得しようとしてるか分からんのです。
Window から取得しようとしてます?
Window が保持しているコントロールの更に内部のコントロールを「名前」で取得するっていうの変じゃありません?(まぁなくはないでしょうけど)
例えば、そのカスタムコントロールを Window に二つ持たせて、FindLogicalNode に this(Window のインスタンスだと判断)を渡してるのってどう思います?名前のスコープどうなんの?って気がしませんか?

引用返信 編集キー/
■34827 / inTopicNo.5)  Re[4]: DataTemplate内のImageの値をコードから書換
□投稿者/ 倉田 有大 (534回)-(2009/04/10(Fri) 19:33:20)
囚人さんお返事ありがとうございます。あいまいでまたまたすいません。thisは最初のWindow1です。

>例えば、そのカスタムコントロールを Window に二つ持たせて、FindLogicalNode に this(Window のインスタンスだと判断)を渡してるのってどう思います?名前のスコープどうなんの?って気がしませんか?

いやー、明らかに変ですね〜^^;
リソース→Imageという順番かなと思ったのですが、方法がまだみつかりません^^;
引用返信 編集キー/
■34833 / inTopicNo.6)  Re[5]: DataTemplate内のImageの値をコードから書換
□投稿者/ 倉田 有大 (537回)-(2009/04/10(Fri) 23:11:41)
var r = this.Resources; //thisはwindow

これで、rにリソースは読み込めるみたいなのですがこれからどうしたらいいかわかりません〜
WPFは情報が少ないな−。探し方が悪いだけかな。
引用返信 編集キー/
■34840 / inTopicNo.7)  Re[6]: DataTemplate内のImageの値をコードから書換
□投稿者/ Hongliang (356回)-(2009/04/11(Sat) 05:53:23)
まず、TreeView は ItemsSource を使った場合、TreeViewItem は遅延生成されます。必要になるまで TreeViewItem は生成されません(ItemContainerGenerator の StatusChanged イベントで確認できます)
TreeViewItem が生成されるとき、ItemTemplate で指定されている DataTemplate の LoadContent 辺りを使うかしてコンテンツが取得されます。それぞれの TreeViewItem のコンテンツは同じテンプレートから生成された別インスタンスです。
また、TreeView のほかに TreeViewItem 自身も ItemsControl であり、TreeViewItem は親の TreeView または TreeViewItem が生成します。ルート直下より下の TreeViewItem については、TreeView の ItemContainerGenerator は関知しません。

リソースを取得する意味はありません。DataTemplate は文字通りテンプレート、鋳型に過ぎません。一旦 TreeViewItem が生成されたら、その TreeViewItem は元の HierarchicalDataTemplate とは無関係に存在し続けます。

FindName メソッドは名前スコープが密接に関連します。
テンプレートが使用された場合、当然ながら同じ名前の要素が複数出現することがあります。そうなると XAML のルート要素(Window とか)からでは名前で見つけることができません。
テンプレートは独自の名前スコープを持ちます。この辺は MSDN の『WPF 名前スコープ』の「スタイルとテンプレートにおける名前スコープ」にいくらか記述があります。
しかし、実のところ問題はそこにはありません。
最大の問題は、DataTemplate によって生成された要素は、TreeViewItem 以下の論理ツリーに参加しないという点です。FindName はその要素が属する名前スコープの論理ツリーをたどって名前を検索するものなので、何をどうしようがそもそも検索対象になっていないのです。あくまで DataTemplate 内のものはデータのビジュアル化のためであるってことなんでしょうかね。
もちろんビジュアルツリーには参加しているので、VisualTreeHelper を使って TreeViewItem 内に DataTemplate で配置されたコンテンツを再帰的に列挙することは可能です。

まとめると以下のようになります。
・それぞれの TreeViewItem で使用される Image オブジェクトは別物。
・TreeViewItem は TreeView および TreeViewItem の ItemsControl.ItemContentGenerator を(再帰的に)使用して検索する。
 ただし未使用の TreeViewItem はそもそも未生成なので取得しようもない。
・FindName は使えない。
・VisualTreeHelper を使って、取得した TreeViewItem から再帰的にビジュアルツリーを調べ、Name をチェックしていく。
・バインディングで解決するのでこれらは全て無駄。
引用返信 編集キー/
■34843 / inTopicNo.8)  Re[7]: DataTemplate内のImageの値をコードから書換
□投稿者/ 倉田 有大 (542回)-(2009/04/11(Sat) 12:51:55)
Hongliangさん、詳細な説明ありがとうございます。
なかなか、ここまで細かくは、書籍には載っていないので助かります。
何度も読み直させてもらっています。

>テンプレートが使用された場合、当然ながら同じ名前の要素が複数出現することがあります。そうなると XAML のルート要素(Window とか)からでは名前で見つけることができません。

特に、ここと

>・バインディングで解決するのでこれらは全て無駄。

ここが、理解できました。バインディングでよかったのですね。

テンプレートを書き換えるということは出来ないのですね。

>(ItemContainerGenerator の StatusChanged イベントで確認できます)

ここで生成のタイミングがわかるのですね。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -