元スレMicrosoft Silverlight その8
silverlight覧 / PC版 /みんなの評価 : ○
451 = :
ゲームに必要なものなんて
・指定した位置に画像を描画する
・音鳴らす
・入力を取得する
・頻繁にコールバックしてもらう
これだけ。何使っても一緒。
勉強ならXNAのようなDirectX系の環境のほうが情報がずっと多くて楽だよ。
452 = :
>>447
それがなぁ、動画サイトって、大元のマスターデータを、DRMの関係でWMVで持ってることが多いらしい。
そして、DRMは、Flashは対応してなくてSilverlightは対応してる。
そういうことらしい。
453 = :
STGじゃないが、この辺りを参考にしてみるとか
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=5c5d06b1-8945-4359-ba11-d191fed22a0b&DisplayLang=ja
454 = :
そういうのどッから探してくるのやら、多謝。
455 = :
どっからと云われると、ココのリンクからだなあ
http://msdn.microsoft.com/ja-jp/windows/aa904962#wpf
456 = :
DataGrid で、セルの値が変更されたら、文字色を変えたいのですが、
そういうイベントはありますか?
SelectionChanged はつかえませんでした。
458 = :
CellEditEnded イベント時にそれ以前の状態と比較すればいいんじゃないの?
461 = :
Cellは通常時用のテンプレートとEdit時用のテンプレートを2つ持っていて
CellTemplateはEditing時では無いときのテンプレート。
462 = :
ああスマンリロードしてなかった。
463 = :
で、CellTemplateの方をTextBlockにでもすればイベント起きるのでは。
そもそもCellEditingTemplateが表示すらされてないと思う
464 = :
>>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 = :
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 = :
TextBlockにするのはCellEditingTemplateじゃなくてCellTemplateの方。
そもそもそのカラムをDataGridTextColumnにしたらちゃんと編集できてイベント走るの?
467 = :
Silverlight 4 でファイルをアップロードするのに
HttpRequestは使えますか?
468 = :
>>467
そもそもなんだけど、ファイルをアップロードするのはクライアント側なのにHttpRequestを使うことに違和感が…
サーバ側クラスであって.NetのClient Profileには入ってないしね。
※ 勘違いならごめんなさい。
未確認だけどやるんならSystem.Net.WebClientクラスでストリーム送信かと。
フォームアプリ系と違ってUploadFileメソッドがないとこをみると、
ローカルファイルアクセスのセキュリティ権限とかの問題も出てくると思う。
でもサンプルは検索すればでてくるよ。
469 = :
あぁごめん、もしサーバ側の受けの事ならHttpRequestは全然使えると思う。
かなり久しいからうろ覚えだけど…orz
というかHttpRequestにこだわんなくてもWebサービス系で受けるとかもできるはず。
470 = :
Visual Web Developer 2010 Exspressで作成した
Silverlightアプリって商用利用できないんですか?
471 = :
ここを見たらできました。
http://www.awaresoft.jp/blog/11-php/51-http-post-binary.html
472 = :
>>470
制限はないよ
473 = :
その前に商用になるアプリが作れない。
474 = :
WindowsフォームですとサブスレッドからGUIスレッドの
メソッドを呼び出すときはinvokeでいけましたが
Silverlightではどのような代替手順があるでしょうか?
475 = :
>>474
Dispatcher.BeginInvoke (非同期)
Silvelightだと同期のInvokeはないんだ…
http://msdn.microsoft.com/ja-jp/library/cc190259(v=VS.95).aspx
476 = :
>>475
おひょひょ。さんくす。
477 = :
>>476
誤解のないようにだけど、「Silvelightだと同期のInvokeはないんだ…」はWPFに対して。
WPFだとForms.Invokeに対応するのが Dispathcer.Invoke。
まあ画面更新関係なら動機である必要はないけど…
478 = :
DataGrid の行を再描画するにはどうすればいいですか?
それぞれの列はDataGridTemplateColumn で複数個のTextBlock が同数ずつあり、
特定列の TextBlock の値の有無で Visibility と Height を制御して見えなくしています。
#それぞれ Binding で持たせています。
値が変わっても表示が変わらないのでおかしいなと思いつつ、試行錯誤した結果、
変化のあった行をスクロールアウトして、再度スクロールインしたところ、ちゃんと表示されます。
#Visibility と Height の制御はされているということです。
スクロールによって、画面が再描画されたのが、きちんと表示された原因だと考えているのですが、
明示的に再描画するメソッド等はありませんか?
状況の説明が下手ですいません。
479 = :
>>478
WPFでしかもDataGridで試してないけどたぶん同じだと思う。
UpdateTargetメソッド → BindingからBindingExpressionを取得して実行。ソースの値で画面を更新。
480 = :
悪い、間違えた。コントロールから取得だった。
以下サンプル。よく使うから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 = :
ちなみにスクロールして表示されるのはメモリ効率による再設定処理が走るから。
※ 再描画ではない
詳しくは仮想化でググってくれ。
482 = :
>>479,480,481
ありがとう。
試してみます。
483 = :
>>482
ごめん、SilverlightにはUpdateTargetなさそう…
調べてわかったらカキコするわ。
484 = :
>>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 = :
>>483
リロードしてませんでした。
お手数をおかけしますが、よろしくお願いします。
486 = :
>>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 = :
データ用クラス
※ 文字数たんなかったから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 = :
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;
}
490 = :
Visibilityでバインドしてないのは、チェックボックスにConverterでバインドしようとしたら何故か実行時にかえって来なくなったから消去した。
WPFだとそのままいけるのに…
というか、ValueConversionAttributeもないのはどういうことよ?w
長々とすまん。
491 = :
コンバーター使わずにVisibility型のプロパティ作って
TextにバインドしてるData1のsetterでVisibility型プロパティのpropertyChangedを起こして
492 = :
>>491
?
とりあえず後段見てData1のsetterでShowData1のフラグを逆にする処理入れてみたらちゃんと効いてる。
…が、そもそも列自体(上でいうcolumn2とか)を非表示にするんだっけ?
つくり的にx:Key=column2 内のTextBlockとかして非表示にできないことに気付いたw
493 = :
あぁ、行の高さを減らすにはCellじゃなくRowの高さを設定しないとダメだね。
ソース適当に作りすぎたw
494 = :
とりあえず上記ソースとの差分
これでテキストボックス修正すれば即時に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");
}
}
496 = :
試行錯誤の結果、DataGrid の OnApplyTemplate メソッドを呼び出せば、
正しく表示されるようになることが判りました。
しかし、どのタイミング(イベント)で呼び出せばよいのか判りません。
LayoutChanged, LostFocus, TextChanged, LostMouseCapture は試したのですが、どれもダメでした。
LayoutChanged: 何度も呼び出されてしまう。
LostFocus: 何度も呼び出されてしまう。
TextChanged: 1文字入力するたびに呼ばれてしまう。
LostMouseCapture: 画面が固まってしまう。
編集が終わったタイミングで一度だけ呼び出すには、一体どのイベントを設定すればよいのでしょうか?
497 = :
ObservableCollection の要素をソートするにはどうすればいいの?
498 = :
Silverlight5 vs HTML5
http://blogs.msdn.com/b/eternalcoding/archive/2011/06/13/html-5-vs-silverlight-5.aspx
499 = :
HTMLで開発なんて悪夢だよ。
500 = :
HTML5はやっぱ、ブラウザ間の差異が酷いな
色々対応するならSL安定かしら
類似してるかもしれないスレッド
- Microsoft Silverlight その9 (574) - [96%] - 2023/1/25 14:30
- Microsoft Silverlight その7 (1001) - [96%] - 2011/3/24 1:31 ○
- Microsoft Silverlight その6 (1001) - [96%] - 2010/11/1 4:09
- Microsoft Silverlight その5 (984) - [96%] - 2010/4/16 20:20 ☆
- Microsoft Silverlight その4 (1001) - [96%] - 2009/12/5 9:05 ○
- Microsoft Silverlight 2.0 その3 (556) - [83%] - 2009/3/24 0:35 ○
- Microsoft Silverlight 2.0 その2 (1001) - [78%] - 2008/11/21 11:47 ○
- Microsoft Silverlight 2.0 (1001) - [74%] - 2008/5/12 6:08 ○
- Silverlight登場で.NET使い大勝利!!! Part2 (525) - [18446744073709551603%] - 2016/10/16 0:30 ○
トップメニューへ / →のくす牧場書庫について