私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレMicrosoft Silverlight その8
silverlight スレッド一覧へ / silverlight とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ○
レスフィルター : (試験中)
ゲームに必要なものなんて
・指定した位置に画像を描画する
・音鳴らす
・入力を取得する
・頻繁にコールバックしてもらう
これだけ。何使っても一緒。
勉強ならXNAのようなDirectX系の環境のほうが情報がずっと多くて楽だよ。
・指定した位置に画像を描画する
・音鳴らす
・入力を取得する
・頻繁にコールバックしてもらう
これだけ。何使っても一緒。
勉強ならXNAのようなDirectX系の環境のほうが情報がずっと多くて楽だよ。
>>447
それがなぁ、動画サイトって、大元のマスターデータを、DRMの関係でWMVで持ってることが多いらしい。
そして、DRMは、Flashは対応してなくてSilverlightは対応してる。
そういうことらしい。
それがなぁ、動画サイトって、大元のマスターデータを、DRMの関係でWMVで持ってることが多いらしい。
そして、DRMは、Flashは対応してなくてSilverlightは対応してる。
そういうことらしい。
DataGrid で、セルの値が変更されたら、文字色を変えたいのですが、
そういうイベントはありますか?
SelectionChanged はつかえませんでした。
そういうイベントはありますか?
SelectionChanged はつかえませんでした。
>>458
どうやらイベントが呼ばれないみたいです。
DataGridTemplateColumn には対応していないのでしょうか?
<sdk:DataGridTemplateColumn Header="ほげほげ">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding Apr0}" />
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
どうやらイベントが呼ばれないみたいです。
DataGridTemplateColumn には対応していないのでしょうか?
<sdk:DataGridTemplateColumn Header="ほげほげ">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding Apr0}" />
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding Apr0}" />
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding Apr0}" />
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
Cellは通常時用のテンプレートとEdit時用のテンプレートを2つ持っていて
CellTemplateはEditing時では無いときのテンプレート。
CellTemplateはEditing時では無いときのテンプレート。
ああスマンリロードしてなかった。
で、CellTemplateの方をTextBlockにでもすればイベント起きるのでは。
そもそもCellEditingTemplateが表示すらされてないと思う
そもそもCellEditingTemplateが表示すらされてないと思う
>>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);
}
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);
}
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");
}
}
}
{
GridData element = e.Row.DataContext as GridData;
if (element != null)
{
MessageBox.Show("Ended:" + previous + ":" + element.Name);
if (previous != element.Name)
{
MessageBox.Show("changed");
}
}
}
TextBlockにするのはCellEditingTemplateじゃなくてCellTemplateの方。
そもそもそのカラムをDataGridTextColumnにしたらちゃんと編集できてイベント走るの?
そもそもそのカラムをDataGridTextColumnにしたらちゃんと編集できてイベント走るの?
Silverlight 4 でファイルをアップロードするのに
HttpRequestは使えますか?
HttpRequestは使えますか?
>>467
そもそもなんだけど、ファイルをアップロードするのはクライアント側なのにHttpRequestを使うことに違和感が…
サーバ側クラスであって.NetのClient Profileには入ってないしね。
※ 勘違いならごめんなさい。
未確認だけどやるんならSystem.Net.WebClientクラスでストリーム送信かと。
フォームアプリ系と違ってUploadFileメソッドがないとこをみると、
ローカルファイルアクセスのセキュリティ権限とかの問題も出てくると思う。
でもサンプルは検索すればでてくるよ。
そもそもなんだけど、ファイルをアップロードするのはクライアント側なのにHttpRequestを使うことに違和感が…
サーバ側クラスであって.NetのClient Profileには入ってないしね。
※ 勘違いならごめんなさい。
未確認だけどやるんならSystem.Net.WebClientクラスでストリーム送信かと。
フォームアプリ系と違ってUploadFileメソッドがないとこをみると、
ローカルファイルアクセスのセキュリティ権限とかの問題も出てくると思う。
でもサンプルは検索すればでてくるよ。
あぁごめん、もしサーバ側の受けの事ならHttpRequestは全然使えると思う。
かなり久しいからうろ覚えだけど…orz
というかHttpRequestにこだわんなくてもWebサービス系で受けるとかもできるはず。
かなり久しいからうろ覚えだけど…orz
というかHttpRequestにこだわんなくてもWebサービス系で受けるとかもできるはず。
Visual Web Developer 2010 Exspressで作成した
Silverlightアプリって商用利用できないんですか?
Silverlightアプリって商用利用できないんですか?
>>470
制限はないよ
制限はないよ
WindowsフォームですとサブスレッドからGUIスレッドの
メソッドを呼び出すときはinvokeでいけましたが
Silverlightではどのような代替手順があるでしょうか?
メソッドを呼び出すときはinvokeでいけましたが
Silverlightではどのような代替手順があるでしょうか?
>>474
Dispatcher.BeginInvoke (非同期)
Silvelightだと同期のInvokeはないんだ…
http://msdn.microsoft.com/ja-jp/library/cc190259(v=VS.95).aspx
Dispatcher.BeginInvoke (非同期)
Silvelightだと同期のInvokeはないんだ…
http://msdn.microsoft.com/ja-jp/library/cc190259(v=VS.95).aspx
>>475
おひょひょ。さんくす。
おひょひょ。さんくす。
>>476
誤解のないようにだけど、「Silvelightだと同期のInvokeはないんだ…」はWPFに対して。
WPFだとForms.Invokeに対応するのが Dispathcer.Invoke。
まあ画面更新関係なら動機である必要はないけど…
誤解のないようにだけど、「Silvelightだと同期のInvokeはないんだ…」はWPFに対して。
WPFだとForms.Invokeに対応するのが Dispathcer.Invoke。
まあ画面更新関係なら動機である必要はないけど…
DataGrid の行を再描画するにはどうすればいいですか?
それぞれの列はDataGridTemplateColumn で複数個のTextBlock が同数ずつあり、
特定列の TextBlock の値の有無で Visibility と Height を制御して見えなくしています。
#それぞれ Binding で持たせています。
値が変わっても表示が変わらないのでおかしいなと思いつつ、試行錯誤した結果、
変化のあった行をスクロールアウトして、再度スクロールインしたところ、ちゃんと表示されます。
#Visibility と Height の制御はされているということです。
スクロールによって、画面が再描画されたのが、きちんと表示された原因だと考えているのですが、
明示的に再描画するメソッド等はありませんか?
状況の説明が下手ですいません。
それぞれの列はDataGridTemplateColumn で複数個のTextBlock が同数ずつあり、
特定列の TextBlock の値の有無で Visibility と Height を制御して見えなくしています。
#それぞれ Binding で持たせています。
値が変わっても表示が変わらないのでおかしいなと思いつつ、試行錯誤した結果、
変化のあった行をスクロールアウトして、再度スクロールインしたところ、ちゃんと表示されます。
#Visibility と Height の制御はされているということです。
スクロールによって、画面が再描画されたのが、きちんと表示された原因だと考えているのですが、
明示的に再描画するメソッド等はありませんか?
状況の説明が下手ですいません。
>>478
WPFでしかもDataGridで試してないけどたぶん同じだと思う。
UpdateTargetメソッド → BindingからBindingExpressionを取得して実行。ソースの値で画面を更新。
WPFでしかもDataGridで試してないけどたぶん同じだと思う。
UpdateTargetメソッド → BindingからBindingExpressionを取得して実行。ソースの値で画面を更新。
悪い、間違えた。コントロールから取得だった。
以下サンプル。よく使うから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();
}
以下サンプル。よく使うから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();
}
ちなみにスクロールして表示されるのはメモリ効率による再設定処理が走るから。
※ 再描画ではない
詳しくは仮想化でググってくれ。
※ 再描画ではない
詳しくは仮想化でググってくれ。
>>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 じゃ向きが真逆だから駄目ですよね?
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
高さ変更だけだけど一部不具合ありで即時反映はとりあえずできた。
不具合っていうのは高さを減らした時に行の高さが減らず、増えるだけっていう困った問題だけど…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;
}
高さ変更だけだけど一部不具合ありで即時反映はとりあえずできた。
不具合っていうのは高さを減らした時に行の高さが減らず、増えるだけっていう困った問題だけど…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;
}
データ用クラス
※ 文字数たんなかったから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");
}
}
※ 文字数たんなかったから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");
}
}
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;
}
{
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;
}
リソース
<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>
<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>
Visibilityでバインドしてないのは、チェックボックスにConverterでバインドしようとしたら何故か実行時にかえって来なくなったから消去した。
WPFだとそのままいけるのに…
というか、ValueConversionAttributeもないのはどういうことよ?w
長々とすまん。
WPFだとそのままいけるのに…
というか、ValueConversionAttributeもないのはどういうことよ?w
長々とすまん。
コンバーター使わずにVisibility型のプロパティ作って
TextにバインドしてるData1のsetterでVisibility型プロパティのpropertyChangedを起こして
TextにバインドしてるData1のsetterでVisibility型プロパティのpropertyChangedを起こして
>>491
?
とりあえず後段見てData1のsetterでShowData1のフラグを逆にする処理入れてみたらちゃんと効いてる。
…が、そもそも列自体(上でいうcolumn2とか)を非表示にするんだっけ?
つくり的にx:Key=column2 内のTextBlockとかして非表示にできないことに気付いたw
?
とりあえず後段見てData1のsetterでShowData1のフラグを逆にする処理入れてみたらちゃんと効いてる。
…が、そもそも列自体(上でいうcolumn2とか)を非表示にするんだっけ?
つくり的にx:Key=column2 内のTextBlockとかして非表示にできないことに気付いたw
あぁ、行の高さを減らすにはCellじゃなくRowの高さを設定しないとダメだね。
ソース適当に作りすぎたw
ソース適当に作りすぎたw
とりあえず上記ソースとの差分
これでテキストボックス修正すれば即時に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");
}
}
これでテキストボックス修正すれば即時に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");
}
}
おれはINotifyPropertyChangedよりDependencyPropertyを使う方が多いな
試行錯誤の結果、DataGrid の OnApplyTemplate メソッドを呼び出せば、
正しく表示されるようになることが判りました。
しかし、どのタイミング(イベント)で呼び出せばよいのか判りません。
LayoutChanged, LostFocus, TextChanged, LostMouseCapture は試したのですが、どれもダメでした。
LayoutChanged: 何度も呼び出されてしまう。
LostFocus: 何度も呼び出されてしまう。
TextChanged: 1文字入力するたびに呼ばれてしまう。
LostMouseCapture: 画面が固まってしまう。
編集が終わったタイミングで一度だけ呼び出すには、一体どのイベントを設定すればよいのでしょうか?
正しく表示されるようになることが判りました。
しかし、どのタイミング(イベント)で呼び出せばよいのか判りません。
LayoutChanged, LostFocus, TextChanged, LostMouseCapture は試したのですが、どれもダメでした。
LayoutChanged: 何度も呼び出されてしまう。
LostFocus: 何度も呼び出されてしまう。
TextChanged: 1文字入力するたびに呼ばれてしまう。
LostMouseCapture: 画面が固まってしまう。
編集が終わったタイミングで一度だけ呼び出すには、一体どのイベントを設定すればよいのでしょうか?
Silverlight5 vs HTML5
http://blogs.msdn.com/b/eternalcoding/archive/2011/06/13/html-5-vs-silverlight-5.aspx
http://blogs.msdn.com/b/eternalcoding/archive/2011/06/13/html-5-vs-silverlight-5.aspx
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / silverlight スレッド一覧へ
みんなの評価 : ○類似してるかもしれないスレッド
- 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 ○
トップメニューへ / →のくす牧場書庫について