Quantcast
Channel: Windows Presentation Foundation ( WPF ) フォーラム
Viewing all 711 articles
Browse latest View live

KeyBindingでコマンドを読んだとき、UpdateSourceTrigger=LostFocusが呼ばれない

$
0
0

お世話になります。

Viewにバインドされたデータの更新・取得についてお教えください。

WindowのKeyBindingとボタンに割り付けられたコマンドは同一の処理を呼んでいます。
あるテキストボックスのUpdateSourceTriggerがLostFocusに設定されていた場合、
テキストボックスの値を変更して、そのままコマンドを実行した場合・・・
1)マウスでボタンを押下してコマンドを呼んだ。
2)キーボードのボタンを押してコマンドを呼んだ

1)の場合は、LostFocusが正しく発生しコマンド内でそのデータが取得できます。
2)の場合はフォーカスが遷移しないため、データが正しく取得できません。

2)の時にも、LostFocusを動かしてデータを更新させたいのですが・・・
よろしくお願いします。

https://dl.dropboxusercontent.com/u/14501064/test18.zip

MainWindow

<Window> <Window.InputBindings><KeyBinding Key="F1" Command="{Binding F1Command}" /><KeyBinding Key="F2" Command="{Binding F2Command}" /></Window.InputBindings><StackPanel><TextBox Text="{Binding Txt1,UpdateSourceTrigger=LostFocus}" Width="200" ></TextBox><Button Content="btn F1" Command="{Binding F1Command}" Width="100" HorizontalAlignment="Left"></Button></StackPanel></Window>



ListBox.SelectedItemをコードビハインドで変更した場合の動作について

$
0
0

お世話になります。

ListBoxでSelectionModeがExtendの時に、コードビハインドやViewModel側でSelectedItemを変更した場合の動作について質問があります。

サンプルとしてListBoxにItemが4つあり、下のボタンでSelectedItemを「C」に変更するだけのものがあります。

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Width="300" Height="300"><Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><ListBox x:Name="listBox" Grid.Row="0" SelectionMode="Extended"><ListBoxItem x:Name="itemA" Content="A" /><ListBoxItem x:Name="itemB" Content="B" /><ListBoxItem x:Name="itemC" Content="C" /><ListBoxItem x:Name="itemD" Content="D" /></ListBox><Button Grid.Row="1" x:Name="button" Click="button_Click" /></Grid></Window>

        private void button_Click(object sender, RoutedEventArgs e)
        {
            listBox.SelectedItem = itemC;
        }

このプログラムで以下の問題が起きています。

  1. マウスクリックで「A」を選択する
  2. ボタンを押下し、「C」が選択状態になる
  3. この状態で Ctrlを押しながら、「D」を選択しようとすると 1.で選択されていた「A」から「D」が選択されてしまう

選択されている「C」と「D」を選択する術はないでしょうか?

単純な知識不足かとも思いますが、ご教授お願いいたします。



WPFのDataGridのXMLデーターのバインドについて

$
0
0

初歩的な質問で恐縮なのです、DataGridのXMLデーターのバインドでの表示で困っています。
(nennpi.xml)

<?xml version="1.0" encoding="utf-8" ?><CARS><CAR><COLUMN NAME="MAKER">トヨタ</COLUMN><COLUMN NAME="NAME">アクア</COLUMN><COLUMN NAME="MILEAGE">40</COLUMN></CAR><CAR><COLUMN NAME="MAKER">トヨタ</COLUMN><COLUMN NAME="NAME">プリウス</COLUMN><COLUMN NAME="MILEAGE">38</COLUMN></CAR><CAR><COLUMN NAME="MAKER">ホンダ</COLUMN><COLUMN NAME="NAME">インサイト</COLUMN><COLUMN NAME="MILEAGE">36</COLUMN></CAR></CARS>

(DataGridPage.xaml)

<Page.Resources><XmlDataProvider x:Key="nennpi" Source="nennpi.xml"/></Page.Resources><Grid><DataGrid DataContext="{StaticResource nennpi}" 
        	ItemsSource="{Binding XPath=/CARS/CAR}"><DataGrid.Columns><DataGridTextColumn Header="メーカー" 
                	Binding="{Binding XPath=COLUMN[@NAME\=\'\MAKER\']}"/><DataGridTextColumn Header="名前" 
                	Binding="{Binding XPath=COLUMN[@NAME\=\'\NAME\']}"/><DataGridTextColumn Header="燃費" 
                	Binding="{Binding XPath=COLUMN[@NAME\=\'\MILEAGE\']}"/></DataGrid.Columns></DataGrid></Grid></Page>

上のnennpi.xmlをDataGridに表示させたいのですが

|メーカー |名前      |燃費 |Name |Value| NodeType|
|--------|---------|-----|-------|-------|---------
|トヨタ    |アクア     | 40  |CAR  |          |Element 
|トヨタ    |プリウス   | 38  |CAR  |         |Element 
|ホンダ  |インサイト | 36  |CAR  |         |Element 

ParentNode                      |ChildNode・・・・・・・・・・
|-----------------------------|----------------------------
|System.Xml.XmlElement |System.Xml.XmlChildNode・・・
|System.Xml.XmlElement |System.Xml.XmlChildNode・・・
|System.Xml.XmlElement |System.Xml.XmlChildNode・・・

このようにNAME列以下、XMLの構造?が表示されてしまいます。

<CAR><MAKER>トヨタ</MAKER>・・・ </CAR>
<DataGridTextColumn Header="メーカー"
             Binding="{Binding XPath=MAKER}"/>
のように要素にしても結果は同じでした。
なぜこのような表示になるのでしょうか。

ご教授ください。


WPFのRibbonをウィンドウの大きさに依存させず常に表示したい

$
0
0

現在はC#で開発を行っており、
.Net4.5から導入されたSystem.Windows.Controls.Ribbonを使用しています。

基本的な動作には問題ないのですが、
親となるRibbonWindowのサイズを小さくするとRibbonが消えてしまい、
その後の操作を行う事ができなくなり困っております。

ウィンドウのサイズを小さくしても常にRibbonを
表示するにはどうしたらよろしいのでしょうか。

方法をご存知の方がいらっしゃいましたら、
教えていただけると大変助かります。


WPFでビルドは通るのにXAMLデザイナでエラーになる。

$
0
0

ほとほと困っています。

VS2010でWPFアプリ作成中、XAMLでCommandBindingsを追加するために以下の様に書きました。

(関係無さそうな部分は省略しています)


XAML

<Window x:Class="MyApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:MyApp" Title="MyApp" Height="400" Width="300"><Window.CommandBindings><CommandBinding Command="{x:Static local:MainWindow.Command1}" CanExecute="Command1_CanExecute" Executed="Command1_Executed"/></Window.CommandBindings></Window>


C#

namespace MyApp { public partial class MainWindow : Window { public static RoutedCommand Command1= new RoutedCommand(); public void Command1_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } public void Command1_Executed(object sender, ExecutedRoutedEventArgs e) { throw new NotImplementedException(); }


もともと、別のプロジェクトで動作済みのコードをコピーしてきたので、ビルドも通り、実行しても意図どおりに動くのですが、

XAMLデザイナで「読み込みで問題が発生しました」と表示され、デザインが表示できなくなってしまうのです。

エラー一覧には、XAMLの7行目に対し、「型'local:MainWindow’は見つかりませんでした。」というエラーが発生しており、確かにその行をコメントアウトすればエラーは消えるのですが、気持ち悪いです。

コードビハインドでCommandBindingする手もありますが、この現象の原因がわかる方がいましたらアドバイスお願いします。

KeyBindingでコマンドを読んだとき、UpdateSourceTrigger=LostFocusが呼ばれない

$
0
0

お世話になります。

Viewにバインドされたデータの更新・取得についてお教えください。

WindowのKeyBindingとボタンに割り付けられたコマンドは同一の処理を呼んでいます。
あるテキストボックスのUpdateSourceTriggerがLostFocusに設定されていた場合、
テキストボックスの値を変更して、そのままコマンドを実行した場合・・・
1)マウスでボタンを押下してコマンドを呼んだ。
2)キーボードのボタンを押してコマンドを呼んだ

1)の場合は、LostFocusが正しく発生しコマンド内でそのデータが取得できます。
2)の場合はフォーカスが遷移しないため、データが正しく取得できません。

2)の時にも、LostFocusを動かしてデータを更新させたいのですが・・・
よろしくお願いします。

https://dl.dropboxusercontent.com/u/14501064/test18.zip

MainWindow

<Window> <Window.InputBindings><KeyBinding Key="F1" Command="{Binding F1Command}" /><KeyBinding Key="F2" Command="{Binding F2Command}" /></Window.InputBindings><StackPanel><TextBox Text="{Binding Txt1,UpdateSourceTrigger=LostFocus}" Width="200" ></TextBox><Button Content="btn F1" Command="{Binding F1Command}" Width="100" HorizontalAlignment="Left"></Button></StackPanel></Window>


ListBox.SelectedItemをコードビハインドで変更した場合の動作について

$
0
0

お世話になります。

ListBoxでSelectionModeがExtendの時に、コードビハインドやViewModel側でSelectedItemを変更した場合の動作について質問があります。

サンプルとしてListBoxにItemが4つあり、下のボタンでSelectedItemを「C」に変更するだけのものがあります。

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Width="300" Height="300"><Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><ListBox x:Name="listBox" Grid.Row="0" SelectionMode="Extended"><ListBoxItem x:Name="itemA" Content="A" /><ListBoxItem x:Name="itemB" Content="B" /><ListBoxItem x:Name="itemC" Content="C" /><ListBoxItem x:Name="itemD" Content="D" /></ListBox><Button Grid.Row="1" x:Name="button" Click="button_Click" /></Grid></Window>

        private void button_Click(object sender, RoutedEventArgs e)
        {
            listBox.SelectedItem = itemC;
        }

このプログラムで以下の問題が起きています。

  1. マウスクリックで「A」を選択する
  2. ボタンを押下し、「C」が選択状態になる
  3. この状態で Ctrlを押しながら、「D」を選択しようとすると 1.で選択されていた「A」から「D」が選択されてしまう

選択されている「C」と「D」を選択する術はないでしょうか?

単純な知識不足かとも思いますが、ご教授お願いいたします。



[WPF]ウィンドウにおける日本語入力開始をテキストボックスに引き継ぎたい

$
0
0

いつも参考にさせていただいております。

WPFのアプリケーションにおいて、ウィンドウにキーボードフォーカスが適用されているときに日本語入力が開始されたら内包するテキストボックスにフォーカスを移してそのまま入力を継続させたいと考えています。

そこで以下の方法を試しましたが、上手くいきません。

1. PreviewKeyDown イベントでテキストボックスの Focus を呼出
-> 最初の文字の入力がスキップされてしまう。

2. TextCompositionManager.AddPreviewTextInputStartHandler イベントでテキストボックスの Focus を呼出
-> IMEがONの場合は同イベントがコールされない。

上記の状況から、.NET Frameworkに用意された標準の機能では厳しそうと考えています。(IME関連のウィンドウメッセージやText Services Framework関連のAPIの調査が必要?)

このようなニーズを実現するための方法に関して、よろしければ何かヒントをいただければと思います。どうぞよろしくお願いします。

XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Focusable="True"
        FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"><TextBox Width="100" Height="20" Name="txt" /></Window>

ソース

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            InputMethod.SetIsInputMethodEnabled(this, true);
            InputMethod.SetPreferredImeState(this, InputMethodState.On);

            // 1.
            PreviewKeyDown += (sender, e) =>
                {
                    if (e.OriginalSource == txt)
                        return;

                    e.Handled = true;
                    txt.Focus();
                };

            // 2.
            //TextCompositionManager.AddPreviewTextInputStartHandler(
            //    this, new TextCompositionEventHandler((sender, e) =>
            //    {
            //        if (e.OriginalSource == txt)
            //            return;

            //        txt.Focus();
            //    }));
        }
    }
}

環境

  • Windows 7 以上
  • .NET Framework 4.5(できれば.NET 4互換が望ましい)

備考

「始めからテキストボックスにフォーカスを適用すればよい」というのは"無し"とさせてください。

実際のシナリオは、テキストボックスはカスタムUIコントロールから動的に表示するものとなっています。

したがって、始めからフォーカスをテキストボックスに置いておくことはできません。


ContentPresenter内に配置されたコントロールのフォーカスについて

$
0
0

現在、WPFを使用して業務アプリケーションの開発を行っております。

各業務画面に共通のヘッダ/フッタの設定を実装するため、、

下記のリンク先のサンプルを参考にさせていただきました。

http://code.msdn.microsoft.com/windowsdesktop/WPFWindow-c471ff75

結果としては、要望通りの画面イメージを作成することができましたが、

各業務画面内に配置しているボタンやチェックボックスに

フォーカスが設定された際に、枠線(点線)が表示されなくなりました。

ContentPresenter等についての理解が乏しく、

何か設定の不備等がございましたら、ご教示いただければと思います。

よろしくお願いいたします。

DataGridの余計な列を削除したい

$
0
0

DataGridの最後に表示される余計な列を削除させたいです。

余計な行は、CanUserAddRowsプロパティをFalseにすれば可能でしたが・・

方法をご存知の方がいらっしゃったら、教えていただきたいです。

Gridに罫線を引く際に、Borderの細かい指定をしなくてもよい方法について

$
0
0

Gridに罫線を引く方法で、もう少し簡単にする方法がないか調査しております。

ご存じの方がいれば、教えていただきたいです。

やりたいこと

 Gridを4分割して、田の字に罫線を引いて、表形式で表示したいです。

 この際に、Gridの罫線の太さを均一(1)にしたいので、各BorderのChicknessの値を、

 セルごとに重複しないように考えて、設定していく必要があります。

 このようなことを行いたい場合、やはり1つ1つ計算して、BorderのChicknessの値をセットしないといけないのでしょうか?

<XAML>

<Grid><Grid.RowDefinitions><RowDefinition Height="71*" /><RowDefinition Height="83*" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="148*" /><ColumnDefinition Width="163*" /></Grid.ColumnDefinitions><Border BorderBrush="Silver" BorderThickness="1" Name="border1" /><Border BorderBrush="Silver" BorderThickness="0,1,1,1" Name="border2" Grid.Column="1" /><Border BorderBrush="Silver" BorderThickness="1,0,1,1" Grid.Row="1" Name="border3" /><Border BorderBrush="Silver" BorderThickness="0,0,1,1" Grid.Column="1" Grid.Row="1" Name="border4" /></Grid>


          


MouseLeftButtonDownを意図的に発生させる方法

$
0
0

ジョイスティックのような外部デバイスから座標情報を取得するプログラムを考えています。
現状C++を利用して作ったプロセスからウィンドウメッセージ等によるメッセージの送信
または、DLLによってプロセスから座標情報を取得する方法のどちらかになると思います。
その座標情報を元にMouseLeftButtonDownを呼び出し指定座標に含まれるオブジェクトにイベントを発生させる方法がわかりません。

ウィンドウメッセージにてWM_LBUTTONDOWNを送ってみたらいけるのでは?と思い試してみたのですが
イベントは発生しませんでした。

MouseLeftButtonDown等の標準的なイベントを任意の座標で発生させるにはどのようにすればいいのか
ご教授いただけると幸いです。

以上よろしくお願いします。

DataGridにフォーカスがないときの選択行の色

$
0
0

DataGridのフォーカスがあるとき、選択行は青色になりますが、

DataGridのフォーカスがないとき、選択行はグレーになります。

DataGridのフォーカスがないときでも選択行を青色にすることはできますでしょうか?

入力エラーが起きた時、フォーカスを移動させなくするには

$
0
0

WPF+Livetの環境でMVVMパターンを使ってデータ入力用のアプリケーションを作成しています。

金額入力用のTextBoxで数字以外が入力された場合、メッセージボックスを表示し、

不正な値(数値に変換できない値)が入力されている間は、金額入力用のTextBoxからフォーカスを

移動したくないのですが、どのように実装すればよいでしょうか。

VMはIDataErrorInfoとLivetのViewModelの派生クラスになっています。

よろしくご教授お願いいたします。

ScrollViewerの中にScrollViewerがあるとマウスホイールで外のScrollViewerがスクロールされない

$
0
0

ItemsControl等のScrollViewerを内包するコントロールのDataTemplateに、さらにScrollViewerを含むDataGrid,TreeView等を設定した場合。

描画後にマウスホイールでスクロールさせようとすると、中(DataTemplate)のScrollViewerがスクロールされて、外(ItemsControl)のScrollViewerがスクロールされません。

この時、中のScrollViewerをスクロールさせずに、外のScrollViewerをスクロールさせるにはどうしたらいいでしょうか?

中のScrollViewerにIsHitTestVisible = Falseで外のScrollViewerがスクロールされるようになりますが、そうしてしまうと全てのイベント(TreeViewItemのSelect等)が発行されなくなってしまうので、この方法は使えませんでした。

<ItemsControl x:Name="myItemsControl"
                      ItemsSource="{Binding Path=Items}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel Orientation="Vertical" /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><DataGrid ItemsSource="{Binding Path=Data}" /></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>


ViewModelから、View(XAML)にある複数のボタンのうち、どのボタンをクリックしたか知る方法

$
0
0

Microsoft.TeamFoundation.MVVM;を利用して、初めてMVVMの開発に挑戦しております。

ViewModelからViewの情報を取得したいのですが、方法がわからないので、

ご存知の方がいれば、教えてください。

(やりたいこと)

1.XAMLに2つのボタンを用意しておいて、そのボタンには同じコマンド(Rename)をバインディングします。

 ボタンの名前をButton1、Button2とします。

2.ViewModelのRenameコマンドにて、どちらのボタンからクリックされたか情報を取得したいです。

  ボタンのContentプロパティに、Button1、Button2とセットし、

  ViewModelでクリックされたボタンのContentプロパティの値を取得したいです。

通常のイベントハンドラを使えば、senderオブジェクトから、クリックしたイベントの情報を取得できると思うのですが・・・

<ViewModel>  
    class VM : ViewModelBase
    {
        public VM ()
        {
            Name = "変更前";
        }


        public String Name { get; set; }


        ICommand _Rename;
        public ICommand Rename
        {
            get
            {
                return _Rename  = new RelayCommand(delegate(object parameter)
                {
                    Name = "変更後";
                    RaisePropertyChanged("Name");
                });
            }
        }

    }

<XAML> <Grid><Button Content="Button1" HorizontalAlignment="Left" Margin="272,134,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Rename}"/><Button Content="Button2" HorizontalAlignment="Left" Margin="272,173,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Rename}"/></Grid>



コードビハインドで動的に作成したボタンをアニメーションさせる

$
0
0

お世話になります。

WindowにWrapPanelを配置し、その中に動的にButtonを作成して、そのButtonをアニメーションさせたいと考えています。
アニメーションは、Blendを使用してStoryboardを作成します。

Blendで静的に作成したButtonに対してアニメーションをかけることはできたのですが、
これを動的に作成したButtonに対して行うとエラーが表示されてしまい、その意味がよく分からず困っています。

コードは以下の様なコードを使用しました。

namespace WpfApplication1
{
   
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        int LineBoxCnt = 0;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            LineBoxCnt++;
            Style  b = this.FindResource("LineArea") as Style;

            Button btn = new Button { Name = "button" + LineBoxCnt, Content = "Line Area " + LineBoxCnt, Style = b };
            RegisterName(btn.Name, btn);
            warpPanel.Children.Add(btn);
        }

        private void warpPanel_Click(object sender, RoutedEventArgs e)
        {
            var cbutton = e.Source;

            Storyboard storyboard = this.FindResource("Storyboard1") as Storyboard;
            if (storyboard != null && storyboard.Children.Count > 0)
            {
                for (int i = 0; i < storyboard.Children.Count; i++ )
                {
                    Storyboard.SetTargetName(storyboard.Children[i], ((Button)cbutton).Name);
                }
                storyboard.Begin(this);
            }
        }
    }
}

Storyboard1は、Blendで一旦静的に作成したButtonに対してアニメーションを設定してXAML内に定義しておき、
TargetNameだけをコード側で差し替えて(動的に作成したButtonへ)アニメーションを行おうと考えています。
しかし、storyboard.Begin(this);を実行すると「型 'System.InvalidOperationException' のハンドルされていない例外が PresentationFramework.dll で発生しました」と表示され、「追加情報:'[Unknown]' プロパティはパス '(0).(1)[3].(2)' で DependencyObject をポイントしません。」と表示されて意味が分からず困っています。

同様の処理を、静的に作成したButtonに対して行った場合(Storyboard.SetTargetNameで同様に書き換え処理も実行)は
正常に動作します。
たぶん何か設定が足りないとかだと思うのですが、なにぶんPCアプリの作成自体不慣れで、
WPFも始めたばっかりでなかなか解決の糸口が見つかりません。

なにかヒントなどでも結構ですので教えていただければと思います。
よろしくお願いします。

Microsoft.TeamFoundation.MVVMを利用してViewModelからMessageBoxを表示させる方法

$
0
0

Microsoft.TeamFoundation.MVVMを利用して、

ViewModelからメッセージボックスを利用したいと思います。

Microsoft.TeamFoundation.MVVMの仕様を見ると、

http://msdn.microsoft.com/ja-jp/library/microsoft.teamfoundation.mvvm(v=vs.110).aspx

MessageBoxService、MessageBoxArgsといったクラスがあり、

これを利用すれば、実現できそうな気がするのですが、

具体的な利用方法がよくわかっておりません。

ViewModelにて、MeesageBox.show(”TEST”);として、実行させてみたところ、

添付画像のエラーが出て、XAMLに{Binding}の定義が必要と表示されます。

MVVMのフレームワークを利用した実装方法のサンプルはたくさん紹介されているのですが、

できればMicrosoft公式のMicrosoft.TeamFoundation.MVVMを利用したいと思っております。

対応方法をご存じの方がいれば、教えていただけないでしょうか。

よろしくお願いいたします。



FluidMoveBehaviorを設定したWarpPanelに対して、動的に作成したButtonを追加した際のビヘイビアの挙動について

$
0
0

お世話になります。

WarpPanelにFluidMoveBehaviorを追加して、WrapPanel上に配置しているButtonをアニメーションさせたいと考えています。
XAMLでWrapPanel上に静的に配置したButtonの場合、BlendでWrapPanelに対してFluidMoveBehaviorを設定するだけで
正常に動作することは確認できました。
(以下のようなXAMLの場合です)

<WrapPanel x:Name="warpPanel" Grid.Row="1" Margin="0,0,0,-195" Orientation="Horizontal" DataContext="Binding" ButtonBase.Click="warpPanel_Click">
<i:Interaction.Behaviors>
<ei:FluidMoveBehavior AppliesTo="Children">
<ei:FluidMoveBehavior.EaseY>
<CircleEase EasingMode="EaseOut"/>
</ei:FluidMoveBehavior.EaseY>
<ei:FluidMoveBehavior.EaseX>
<CircleEase EasingMode="EaseOut"/>
</ei:FluidMoveBehavior.EaseX>
</ei:FluidMoveBehavior>
</i:Interaction.Behaviors>
<Button x:Name="button" Content="Button" HorizontalAlignment="Left" Height="47.368" VerticalAlignment="Top" Width="113.684" RenderTransformOrigin="0.5,0.5">
<Button.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Button.RenderTransform>
</Button>
</WrapPanel> 


しかし、このWarpPanel上に、コードビハインドで動的に作成したButtonを追加しても
同様のアニメーションは実行されませんでした。
この場合、どのような処理をコードビハインド側に記述すればよいのでしょうか?

(どうもWrapPanelに設定したFluidMoveBehaviorでは有効にならないようです、理由は分かっていません。
それ以外の方法だと、追加したボタン毎にFluidMoveBehaviorを追加するぐらいしか思いつかなかったのですが、
それもi:Interaction.Behaviors辺りをどのようにコードに落とせばよいのかイマイチ理解できておりません。。。)

なにかよい手段があれば教えていただければと思います。
よろしくお願いします。


WPFのDataGridについて質問

$
0
0

(前提)

WPFのDataGridについて質問です。
横軸が、可変個数の日付をヘッダーにしたDataGridを作っています。
横軸の要素数が可変なので、XAMLで固定で書くことはできず、コードビハインドで、DataContextChangedのイベントで、バインドしたデータを元に動的に作成しています。

ここで、以前似たようなことをしていた時は、単に文字列として表示できれば良かったのですが、今回は、表示する要素が複雑なのです。各セルの内容に、さらに、複数の要素の可変個数のコレクションを内包した要素を表示し、さらに編集もしたいのです。

DataGridのセル1つの中に、さらにネストしてListBoxが複数並んでいるようなイメージです。

ここで、固定の列をXAMLで書くのならば、DataGridTemplateColumnとして、内部にListBoxなどを配置したものを定義すればよいわけですが、これをコードでなく、コードビハインドでやろうとすると、

①肝心のDataTemplate自体がコードでは作れない??
②強引に、DataTemplate自体はXAMLでResourcesの中に定義して、FindResourceでそれを持ってきても、コードからバインディングを設定することが、TextColumnだと簡単にできたのに、TemplateColumnだとそれが不可能??
③XAMLの方でDataTemplate内で直接バインドを指定してしまうのは、バインド先が固定なら問題ないのですが、可変行のため、実際は列0,1,2...に対して、バインド先コレクション[0],[1],[2],....と、インデクサ経由でバインドさせないといけないので、今回の場合XAML内で指定もできない。

というような問題で、行き詰ってしまっています。

(質問1)
コードビハインドから、動的にDataGridTemplateColumnをコードで作成して、コレクション[0],[1],[2]…に順次データバインドさせる、そんなことは可能なのでしょうか?

******************************

上記の、DataGridTemplateColumnを作ってバインドさせる方法が行き詰ってしまっているので、とりあえず、セル内にネストして配置したかったListBoxで表示させる内容を、全て改行区切りで連結させて1つの文字列にしてしまって、DataGridTextColumを使って、単なる改行付の文字列として表示だけはさせるものを作ってみました。

こちらで、セルの内容をToolTipとして表示させたく(セルとして並べるので横幅をあまり取りたくない、しかし全文確認できないと困るので)、次のようにXAMLでStyleを設定しています(そしてこれを、コードビハインドでDataGridTextColumnを追加する際に、FindResourceで読み込んで、CellStyleに設定しています。

<Style TargetType="{x:Type DataGridCell}" x:Key="style1"><Setter Property="ToolTip" Value="{Binding Path=Content, RelativeSource={RelativeSource Mode=Self},Mode=OneWay}"/></Style>

そうすると、DataGridのセルの上にマウスを持っていくと、その内容がちゃんとToolTipで表示されるのですが、表示した瞬間、代わりに、肝心のDataGridのセルの中身がクリアされてしまうという怪現象が起きています。

(質問2)

上のXAMLの指定が悪いのでしょうか? DataGridTextColumnの文字列の内容を、そのままToolTipで表示したいだけなのですが、どうすればよいでしょうか?

以上よろしくお願いします。

Viewing all 711 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>