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

    元スレMicrosoft Silverlight その8

    silverlight覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    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安定かしら


    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / silverlight一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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