2014年7月31日木曜日

[WPF][Silverlight][C#]MVVM パターンで TextBox をフォーカス

FocusManager を使えばフォーカス設定できますが、TextBox の IsEnabled が false だったり、複数のFocusManager の設定があると、意図した動きをしてくれなくなります。

如何にすればシンプルに出来るか考えてみましたが、Behavior 使うのが一番シンプルに収まりそうです。フォーカス設定のみだと寂しいので、文字列全選択も書きました。



    public class TextBoxBehavior : Behavior<TextBox>
    {
        /// <summary>
        /// フォーカス設定
        /// </summary>
        public void Focus()
        {
            this.AssociatedObject.Focus();
        }

        /// <summary>
        /// 全選択
        /// </summary>
        public void SelectAll()
        {
            this.AssociatedObject.SelectAll();
        }
    }

後は、XAML側でボタンクリックされた時などに、CallMethodAction を書くだけでOKです。

<Window x:Class="Sample.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
        xmlns:local="clr-namespace:Sample">
    <StackPanel>
        <Button Content="Button" HorizontalAlignment="Left" Width="75">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <ei:CallMethodAction TargetObject="{Binding ElementName=textBoxBehavior}" MethodName="Focus" />
                    <ei:CallMethodAction TargetObject="{Binding ElementName=textBoxBehavior}" MethodName="SelectAll" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

        <TextBox HorizontalAlignment="Left" Height="23" Text="TextBox" Width="120">
            <i:Interaction.Behaviors>
                <local:TextBoxBehavior x:Name="textBoxBehavior" />
            </i:Interaction.Behaviors>
        </TextBox>
    </StackPanel>
</Window>





[WPF]MVVM パターンで DialogResult を変更する

View のみで変更するパターンと、ViewModel からView に通知して閉じるパターンを書きます。後者だと ViewModel の処理結果で閉じないようなケースにも対応出来ますねー。


<Window x:Class="Sample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
        xmlns:local="clr-namespace:Sample"
        Height="350" Width="525"
        Name="dialog"
        >
    <Window.DataContext>
        <local:ViewModel x:Name="viewModel" />
    </Window.DataContext>
    <Grid>

        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom" >
            <Button Content="From View" Margin="5" >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <ei:ChangePropertyAction TargetObject="{Binding ElementName=dialog}" PropertyName="DialogResult" Value="True" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>

            <Button Content="From ViewModel" Margin="5" >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <ei:CallMethodAction TargetObject="{Binding ElementName=viewModel}" MethodName="Execute" />
                    </i:EventTrigger>
                    <ei:DataTrigger Binding="{Binding Path=CloseFlag}" Value="True">
                        <ei:ChangePropertyAction TargetObject="{Binding ElementName=dialog}" PropertyName="DialogResult" Value="True" />
                    </ei:DataTrigger>
                </i:Interaction.Triggers>
            </Button>
        </StackPanel>
    </Grid>
</Window>

    public class ViewModel : INotifyPropertyChanged
    {
        /// <summary>
        /// プロパティ変更イベントハンドラ
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// プロパティ変更処理
        /// </summary>
        /// <param name="name">プロパティ名</param>
        public void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }

        /// <summary>
        /// 終了フラグ
        /// </summary>
        private bool closeFlag = false;
        /// <summary>
        /// 終了フラグを取得または設定します。
        /// </summary>
        public bool CloseFlag
        {
            get { return closeFlag; }
            set { closeFlag = value; OnPropertyChanged("CloseFlag"); }
        }

        /// <summary>
        /// 実行
        /// </summary>
        public void Execute()
        {
            // execute process

            // Close
            CloseFlag = true;
        }
    }









[VMware]起動時にエラー

VMware Player で RHEL を起動させたところ、次のエラーが発生し、起動できませんでした。

パワーオン中にエラーが発生しました: Trahsport (VMDB) error -44: Mssage.
The VMWare Authorization Service is not running。

サービスが起動していないということで、コントロールパネル - 管理ツール - サービスを起動してみると、「VMware Authorization Service」が未起動でした。


これを開始して再度立ち上げると立ち上がるようになりました。このサービス、スタートアップで自動起動するようになっているのですが、仮想OSを立ち上げようとすると稀に落ちるみたいですね。Player はフリーなので文句は言いません。回避出来るので良しです。


[iDVD]iMovie->iDVD->Burn->NG

デジタルビデオカメラで撮影した動画はAVCHD規格の動画形式(拡張子がmts)は Windows なら Media Player でそのまま再生出来ますが、Mac だとそうはいきません。
iMovie なら動画サイズがギガバイト単位で肥大化しますが、読み込みは出来ます。
ムービーメーカーよりは iMovie がいいなと思い、Mac で編集することにしました。

ロードする時のサイズをフルハイにしてロードし、編集後、iDVD に共有しました。

テーマを適当に変更していざDVDに焼こうとしたら次のエラーが出ました。

「メニュー全体の継続時間が15分を超えています」

そんなにメニュー長くないんだけど。。。エラーメッセージを検索してみたところ、音楽を短くしたら・・・とありましたが、効果ありませんでした。

試しにテーマを変えてみたら、うまくいった。多分、フルハイ対応じゃないテーマだったのかなと解釈しています。使い勝手はいんだけど、エラーメッセージがわかりづらい。

NHKはなぜ金持ちなのか? 小田桐 誠 (著)

iMovie で娘のダンスイベントを編集して iDVD へ共有させてます。結構時間がかかるので、待ち時間を利用して駄文を少々。


先週末「NHKはなぜ金持ちなのか?」を読みました。纏めようと思ってたら丁度纏めてくれている人がいたので、リンクだけ貼付けて怠けます。

職員の平均年収は1780万円! NHKの信じがたい金満ぶり

少々補足。現会長の籾井(もみい)氏は年収でいうと3200万くらい。で、プラス厚い手当があります。NHKの手当はものすごいです。600万くらいですかねー。

ざっと斜め読みしただけなんですが、この本では何故金持ちなのかということにはあんまり触れられていないような印象でした。

ラジオ放送の受信料時代から始まり衛星放送を経て、現在に至るまでの発言や経緯、また今後の展開などの歴史的な話はインタビュー形式で取り纏めてくれています。

インタビューの他は筆者の主張です。地デジとBSの予算の分配がうまくない!とか、予算の組み方(プロジェクト810の予算)がめちゃくちゃだ!もっとこうあるべきだー!云々というような話が論ぜられていました。面白いです。個人的には、国と NHK の関係が両者意識あってないんじゃないの?という印象を受けました。

籾井氏は23日に将来、ネット配信も行うし料金も徴収するとか言ってましたが、人件費が高いんだから徴収する人を減らせる方向に持って行った方が言いように思います。具体的には放送法を見直してスクランブル化するのでよいのではないでしょうか。魅力的なコンテンツを提供する自信もあるのだろうし、実際提供しているのだからそれなりに徴収出来ますよね。そりゃ今よりは減るかもしれませんが、経費も圧倒的に減ると思うので行けるのでは?いやいや雇用も減るではないか!と怒らないでください。マイナンバー特需で2年くらいは人手不足だし、きっといけるいける。

なーんて甘い無責任な発言をしてみたり。したところで DVD 完成。かっこえ〜のがチョチョイで作れちゃうから。映像作るのっておもろいね。


2014年7月27日日曜日

画像ファイルなどの共有について

ご近所さん達が集まって花火大会をしました。適当に写真をパシャパシャとりましたが、全員に対して全部プリントアウトして渡すのもコストだなぁと思い、共有サービスとかを使ってアドレスだけ通知することにしました。


いきなり結論

共有サービスを色々と試してみましたが、最終的にマイクロソフトの One Drive が一番いい感じです。以前は Sky Drive という名前だったと思うのですが、刷新されたんですね。しかも容量が 15 GB まで使えるようになってます。

まずはアップロード



ログインすると、次のような画面が表示されます。



フォルダを作成して、そこに写真をドラッグ&ドロップするだけで OK です。
フォルダ内が画像ファイルだけだと自動的に「フォルダの種類」が「画像」になるようで(フォルダ右クリック - プロパティで確認出来ます)、画像になっていると次の機能が自動的に発動するようです。


  • フォルダはスライドショー的に中の画像が切り替わります。
  • フォルダを開くとタイル状に写真サイズを判断してオシャレに配列してくれます。
  • 画像の表示がフェードインです。
  • 画像を表示すると Mac OS X Finder の Cover Flow ライクに表示してくれます。かっこいい。
  • フルスクリーンでスライドショーを実行出来る。



共有する

アップロードしたファイルは基本的に自分専用なので、共有します。共有したいフォルダ/ファイルを選択して右クリックしましょう。


これの「共有」を選択します。ちなみに「ダウンロード」を選択するとフォルダなら圧縮してダウンロードされます。共有の設定画面はこれです。


Facebook やってない人もいると思うので、今回は「リンクの取得」を選びます。
共有する範囲を選択し、「リンクの作成」ボタンを押すだけでOKです。

リンクが生成されます。


このリンクを共有したい人に通知するだけで、他の人も見れるようになります。
ちなみにリンクの短縮をクリックすると、リンクが短くなります。かゆいところに手が届くー。マイクロソフト、なかなかいい感じです。


ここからは、Pages で名刺のテンプレートにリンクURLを貼付けて、ご近所さんに配りました。


他の共有サービス
いくつか試みましたが、うまく出来なかったり微妙でした。簡単に書いておきます。

  1. Flickr
    老舗中の老舗ですね。AppleTVにメニューがあるんで、本当はこれを使ってみたかったのですが、結局アカウントが作成出来ず、断念しました。Yahoo アカウントが必要です。gmail か facebook とも連結出来るようですが、何故かうまく行きませんでした。Yahoo アカウントを作ろうとしましたが、携帯に確認用SMSが通知されてこず、それ以降の手続きが出来ませんでした。携帯番号の入れ方が間違っているのかな???頭の0を取ったりしてみたんですが。iPhone がダメなのかな。。。
  2. GooglePlus
    gmailがあるんで、それでやろうとしましたが、共有した場合、全員が画像の操作(例えば削除とか)が出来るようになってしまい、これではダメだと断念。参照のみとか出来るのかもしれませんが、ざっと見た感じ見当たりませんでした。
  3. CANON IMAGE GATEWAY
    プリンタ買った時にそんなのがあったなーと思い出して登録してみました。が、いざ画像をアップロードしようとしたら、プリンタ購入だけだと画像のアップロードに対応していないとか。デジカメ、ビデオカメラもあるんですが、シリアル番号がわからなくて断念。
この時点で深夜2時をまわってたので、これ以上は調べませんでした。

One Drive でほぼ完成されていると思うのですが、それ以上のものを知っている人がいましたら是非教えて頂きたいです。