のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,641,318人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレMicrosoft Silverlight その8

silverlight スレッド一覧へ / silverlight とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
451 : デフォルトの名無 - 2011/06/09(木) 22:05:49.85 (+62,+29,-57)
ゲームに必要なものなんて
・指定した位置に画像を描画する
・音鳴らす
・入力を取得する
・頻繁にコールバックしてもらう
これだけ。何使っても一緒。
勉強ならXNAのようなDirectX系の環境のほうが情報がずっと多くて楽だよ。
452 : デフォルトの名無 - 2011/06/09(木) 22:21:02.92 (+13,-29,-51)
>>447
それがなぁ、動画サイトって、大元のマスターデータを、DRMの関係でWMVで持ってることが多いらしい。
そして、DRMは、Flashは対応してなくてSilverlightは対応してる。
そういうことらしい。
453 : デフォルトの名無 - 2011/06/09(木) 22:24:24.50 (+44,+6,+0)
454 : デフォルトの名無 - 2011/06/09(木) 23:40:33.53 (+57,+29,-5)
そういうのどッから探してくるのやら、多謝。
455 : 453 - 2011/06/09(木) 23:45:57.03 (+56,+28,+0)
どっからと云われると、ココのリンクからだなあ

http://msdn.microsoft.com/ja-jp/windows/aa904962#wpf
456 : デフォルトの名無 - 2011/06/11(土) 14:10:05.68 (+38,-29,-42)
DataGrid で、セルの値が変更されたら、文字色を変えたいのですが、
そういうイベントはありますか?

SelectionChanged はつかえませんでした。
457 : デフォルトの名無 - 2011/06/11(土) 14:30:48.85 (+0,-23,-14)
バインドしてるVM側でやる
458 : デフォルトの名無 - 2011/06/11(土) 14:57:52.95 (+2,-29,-19)
CellEditEnded イベント時にそれ以前の状態と比較すればいいんじゃないの?
459 : 456 - 2011/06/11(土) 21:17:14.35 (-1,-30,-273)
>>458
どうやらイベントが呼ばれないみたいです。
DataGridTemplateColumn には対応していないのでしょうか?

<sdk:DataGridTemplateColumn Header="ほげほげ">
  <sdk:DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
          <StackPanel Orientation="Vertical">
              <TextBox Text="{Binding Apr0}" />
          </StackPanel>
      </DataTemplate>
  </sdk:DataGridTemplateColumn.CellTemplate>
  
460 : 456 - 2011/06/11(土) 21:28:29.91 (-12,-30,-223)
  <sdk:DataGridTemplateColumn.CellEditingTemplate>
      <DataTemplate>
          <StackPanel Orientation="Vertical">
              <TextBox Text="{Binding Apr0}" />
          </StackPanel>
      </DataTemplate>
  </sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
461 : デフォルトの名無 - 2011/06/11(土) 21:33:16.85 (+8,-29,-93)
Cellは通常時用のテンプレートとEdit時用のテンプレートを2つ持っていて
CellTemplateはEditing時では無いときのテンプレート。
462 : 461 - 2011/06/11(土) 21:35:19.09 (+52,+29,-2)
ああスマンリロードしてなかった。
463 : デフォルトの名無 - 2011/06/11(土) 21:38:14.44 (+4,-29,-80)
で、CellTemplateの方をTextBlockにでもすればイベント起きるのでは。
そもそもCellEditingTemplateが表示すらされてないと思う
464 : 456 - 2011/06/11(土) 22:44:13.87 (+3,-30,-221)
>>463
CellEditingTemplate の方を TextBlock にすると、エディットできなかったです。
それで仕方なく TextBox にしました。
↓の方法だとエディット前の値を保存できませんでした。
     string previous;

      private void CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            TextBox cell = e.EditingElement as TextBox;

            previous = cell.Text;
            MessageBox.Show("Editing:" + previous);
        }

    
465 : 456 - 2011/06/11(土) 22:50:30.38 (+3,-30,-170)
private void CellEditEnded(object sender, DataGridCellEditEndedEventArgs e)
 {
    GridData element = e.Row.DataContext as GridData;
       if (element != null)
        {
         MessageBox.Show("Ended:" + previous + ":" + element.Name);
            if (previous != element.Name)
            {
                MessageBox.Show("changed");
            }
        }
}
466 : デフォルトの名無 - 2011/06/12(日) 00:03:36.91 (+3,-30,-105)
TextBlockにするのはCellEditingTemplateじゃなくてCellTemplateの方。
そもそもそのカラムをDataGridTextColumnにしたらちゃんと編集できてイベント走るの?
467 : デフォルトの名無 - 2011/06/13(月) 18:16:48.97 (+4,-29,-32)
Silverlight 4 でファイルをアップロードするのに
HttpRequestは使えますか?
468 : デフォルトの名無 - 2011/06/14(火) 00:34:12.41 (+3,-29,-165)
>>467
そもそもなんだけど、ファイルをアップロードするのはクライアント側なのにHttpRequestを使うことに違和感が…
サーバ側クラスであって.NetのClient Profileには入ってないしね。
※ 勘違いならごめんなさい。

未確認だけどやるんならSystem.Net.WebClientクラスでストリーム送信かと。
フォームアプリ系と違ってUploadFileメソッドがないとこをみると、
ローカルファイルアクセスのセキュリティ権限とかの問題も出てくると思う。
でもサンプルは検索すればでてくるよ。
469 : デフォルトの名無 - 2011/06/14(火) 00:38:17.94 (+62,+29,-11)
あぁごめん、もしサーバ側の受けの事ならHttpRequestは全然使えると思う。
かなり久しいからうろ覚えだけど…orz
というかHttpRequestにこだわんなくてもWebサービス系で受けるとかもできるはず。
470 : デフォルトの名無 - 2011/06/14(火) 11:33:23.55 (+25,-30,-43)
Visual Web Developer 2010 Exspressで作成した
Silverlightアプリって商用利用できないんですか?
471 : デフォルトの名無 - 2011/06/14(火) 14:38:01.73 (+45,+22,-2)
472 : デフォルトの名無 - 2011/06/14(火) 15:06:10.31 (+49,+22,+0)
>>470
制限はないよ
473 : デフォルトの名無 - 2011/06/14(火) 21:50:49.74 (+55,+27,-3)
その前に商用になるアプリが作れない。
474 : デフォルトの名無 - 2011/06/15(水) 11:27:57.96 (+2,-29,-84)
WindowsフォームですとサブスレッドからGUIスレッドの
メソッドを呼び出すときはinvokeでいけましたが
Silverlightではどのような代替手順があるでしょうか?
475 : デフォルトの名無 - 2011/06/15(水) 18:50:54.68 (+29,-30,-71)
>>474

Dispatcher.BeginInvoke (非同期)
Silvelightだと同期のInvokeはないんだ…

http://msdn.microsoft.com/ja-jp/library/cc190259(v=VS.95).aspx
476 : デフォルトの名無 - 2011/06/15(水) 18:52:49.82 (+63,+29,-14)
>>475
おひょひょ。さんくす。
477 : デフォルトの名無 - 2011/06/15(水) 18:55:01.24 (+11,-30,-76)
>>476
誤解のないようにだけど、「Silvelightだと同期のInvokeはないんだ…」はWPFに対して。
WPFだとForms.Invokeに対応するのが Dispathcer.Invoke。
まあ画面更新関係なら動機である必要はないけど…
478 : デフォルトの名無 - 2011/06/15(水) 19:15:46.90 (+49,-30,-310)
DataGrid の行を再描画するにはどうすればいいですか?

それぞれの列はDataGridTemplateColumn で複数個のTextBlock が同数ずつあり、
特定列の TextBlock の値の有無で Visibility と Height を制御して見えなくしています。
#それぞれ Binding で持たせています。

値が変わっても表示が変わらないのでおかしいなと思いつつ、試行錯誤した結果、
変化のあった行をスクロールアウトして、再度スクロールインしたところ、ちゃんと表示されます。
#Visibility と Height の制御はされているということです。

スクロールによって、画面が再描画されたのが、きちんと表示された原因だと考えているのですが、
明示的に再描画するメソッド等はありませんか?

状況の説明が下手ですいません。
479 : デフォルトの名無 - 2011/06/15(水) 19:18:53.49 (+34,-30,-68)
>>478
WPFでしかもDataGridで試してないけどたぶん同じだと思う。

UpdateTargetメソッド → BindingからBindingExpressionを取得して実行。ソースの値で画面を更新。
480 : デフォルトの名無 - 2011/06/15(水) 19:22:17.32 (+9,-30,-235)
悪い、間違えた。コントロールから取得だった。
以下サンプル。よく使うからstaticクラスで定義して拡張メソッドとして使用。
※ WPFソース

public static void UpdateTarget(this TextBox sender)
{
UpdateTarget(sender, TextBox.TextProperty);
}
public static void UpdateTarget(this Label sender)
{
UpdateTarget(sender, Label.ContentProperty);
}
public static void UpdateTarget(this FrameworkElement sender, DependencyProperty dp)
{
var exp = sender.GetBindingExpression(dp);
if (exp != null)
exp.UpdateTarget();
}
481 : デフォルトの名無 - 2011/06/15(水) 19:24:35.27 (+1,-26,-58)
ちなみにスクロールして表示されるのはメモリ効率による再設定処理が走るから。
※ 再描画ではない

詳しくは仮想化でググってくれ。
482 : 478 - 2011/06/15(水) 19:51:36.22 (+66,+21,+0)
>>479,480,481
ありがとう。
試してみます。
483 : デフォルトの名無 - 2011/06/15(水) 19:58:51.54 (+56,-13,-30)
>>482
ごめん、SilverlightにはUpdateTargetなさそう…
調べてわかったらカキコするわ。
484 : 478 - 2011/06/15(水) 20:01:52.03 (+4,-30,-243)
>>480
UpdateTarget メソッドが無いのか、VS2010 のエディタでエラーになります。
using System.Windows; ステートメントはあります。

public static void UpdateTarget(this FrameworkElement sender, DependencyProperty dp) 

    var exp = sender.GetBindingExpression(dp); 
    if (exp != null) 
        exp.UpdateTarget(); // UpdateTarget メソッドが無い?


UpdateSource メソッドならあるのですが、Target と Source じゃ向きが真逆だから駄目ですよね?
485 : 478 - 2011/06/15(水) 20:02:52.14 (+70,+28,-2)
>>483
リロードしてませんでした。
お手数をおかけしますが、よろしくお願いします。
486 : デフォルトの名無 - 2011/06/15(水) 21:39:50.81 (+12,-30,+0)
>>485
高さ変更だけだけど一部不具合ありで即時反映はとりあえずできた。
不具合っていうのは高さを減らした時に行の高さが減らず、増えるだけっていう困った問題だけど…orz

とりあえずSystem.ComponentModel.INotifyPropertyChangedを実装したクラスを使ってる?
これで変更イベントあげれば即時に変わってくれる。
というか、ObservableCollectionとINotifyPropertyChangedのusingがデフォルトでないのはキツイな…
なんでSilverlightだとないんだろ?
んで、DB以外の結果をバインドするならSystem.Collections.ObjectModel.ObservableCollectionとINotifyPropertyChanged使わないとダメよ?
あとは頑張ってくれ!

☆☆ 以下、やっつけソースの抜粋

using System.ComponentModel;
using System.Collections.ObjectModel;

private ObservableCollection<TestData> dataList = new ObservableCollection<TestData>();
public MainPage()
{
InitializeComponent();

for (int i = 1 ; i < 1000; i++)
dataList.Add(new TestData() { ShowData1 = Visibility.Visible, ShowData2 = Visibility.Visible, Data1 = "Data1-" + i.ToString("0000"), Data2 = "Data2-" + i.ToString("0000"), Height = 80, Updated = DateTime.Now });

dataGrid1.ItemsSource = dataList;
}
487 : デフォルトの名無 - 2011/06/15(水) 21:41:57.76 (+3,-30,-251)
データ用クラス
※ 文字数たんなかったからData2とかは端折った。

public class TestData : INotifyPropertyChanged
{
private Visibility showData1;
private string data1;
private int height;

public Visibility ShowData1
{
get
{
return showData1;
}
set
{
if (showData1 == value)
return;

showData1 = value;
OnPropertyChanged("ShowData1");
}
}
488 : デフォルトの名無 - 2011/06/15(水) 21:42:53.84 (+3,-30,-241)
public string Data1
{
get { return data1; }
set
{
if (data1 == value)
return;

data1 = value;
OnPropertyChanged("Data1");
}
}
public int Height
{
get { return height;}
set
{
if (height == value)
return;

height = value;
OnPropertyChanged("Height");
}
}
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
public event PropertyChangedEventHandler PropertyChanged;
}
489 : デフォルトの名無 - 2011/06/15(水) 21:48:30.74 (-7,-30,+0)
リソース
<DataTemplate x:Key="column1">
<StackPanel Height="{Binding Mode=OneWay, Path=Height}">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Mode=TwoWay, Path=Data1}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Mode=TwoWay, Path=Data2}" />
</StackPanel>
<TextBox Text="{Binding Mode=TwoWay, Path=Height}" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="column2">
<TextBlock Text="{Binding Mode=OneWay, Path=Data1}" Visibility="Visible"/>
</DataTemplate>
以下略

Grid
<Grid x:Name="LayoutRoot" Background="White">
<sdk:DataGrid AutoGenerateColumns="False" Height="600" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="800">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn CellTemplate="{StaticResource column1}" />
<sdk:DataGridTemplateColumn CellTemplate="{StaticResource column2}" />
<sdk:DataGridTemplateColumn CellTemplate="{StaticResource column3}" />
<sdk:DataGridTemplateColumn CellTemplate="{StaticResource column4}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
490 : デフォルトの名無 - 2011/06/15(水) 21:51:13.59 (+3,-29,-58)
Visibilityでバインドしてないのは、チェックボックスにConverterでバインドしようとしたら何故か実行時にかえって来なくなったから消去した。
WPFだとそのままいけるのに…
というか、ValueConversionAttributeもないのはどういうことよ?w

長々とすまん。
491 : デフォルトの名無 - 2011/06/15(水) 21:55:22.86 (+4,-30,-75)
コンバーター使わずにVisibility型のプロパティ作って
TextにバインドしてるData1のsetterでVisibility型プロパティのpropertyChangedを起こして
492 : デフォルトの名無 - 2011/06/15(水) 22:11:49.43 (+3,-30,-140)
>>491

とりあえず後段見てData1のsetterでShowData1のフラグを逆にする処理入れてみたらちゃんと効いてる。
…が、そもそも列自体(上でいうcolumn2とか)を非表示にするんだっけ?
つくり的にx:Key=column2 内のTextBlockとかして非表示にできないことに気付いたw
493 : デフォルトの名無 - 2011/06/15(水) 22:14:11.50 (+57,+29,-28)
あぁ、行の高さを減らすにはCellじゃなくRowの高さを設定しないとダメだね。
ソース適当に作りすぎたw
494 : デフォルトの名無 - 2011/06/15(水) 22:21:02.11 (+3,-30,+0)
とりあえず上記ソースとの差分
これでテキストボックス修正すれば即時にVisibilityも画面反映される。

<DataTemplate x:Key="column2">
<TextBlock Height="{Binding Mode=OneWay, Path=Height}" Text="{Binding Mode=OneWay, Path=Data1}" Visibility="{Binding Mode=OneWay, Path=ShowData1}"/>
</DataTemplate>


public string Data1
{
get
{
return data1;
}
set
{
ShowData1 = showData1 == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;

if (data1 == value)
return;

data1 = value;
OnPropertyChanged("Data1");
}
}
495 : デフォルトの名無 - 2011/06/16(木) 08:27:06.80 (-2,-30,-25)
おれはINotifyPropertyChangedよりDependencyPropertyを使う方が多いな
496 : 478 - 2011/06/16(木) 18:00:24.80 (+3,-30,-151)
試行錯誤の結果、DataGrid の OnApplyTemplate メソッドを呼び出せば、
正しく表示されるようになることが判りました。

しかし、どのタイミング(イベント)で呼び出せばよいのか判りません。
LayoutChanged, LostFocus, TextChanged, LostMouseCapture は試したのですが、どれもダメでした。

LayoutChanged: 何度も呼び出されてしまう。
LostFocus: 何度も呼び出されてしまう。
TextChanged: 1文字入力するたびに呼ばれてしまう。
LostMouseCapture: 画面が固まってしまう。

編集が終わったタイミングで一度だけ呼び出すには、一体どのイベントを設定すればよいのでしょうか?
497 : デフォルトの名無 - 2011/06/17(金) 21:47:34.15 (+2,-29,-14)
ObservableCollection の要素をソートするにはどうすればいいの?
498 : デフォルトの名無 - 2011/06/17(金) 22:34:42.67 (+34,-29,-27)
499 : デフォルトの名無 - 2011/06/17(金) 22:46:17.77 (+33,+10,-5)
HTMLで開発なんて悪夢だよ。
500 : デフォルトの名無 - 2011/06/17(金) 22:52:47.57 (+53,+25,-30)
HTML5はやっぱ、ブラウザ間の差異が酷いな
色々対応するならSL安定かしら
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / silverlight スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について