locked
ExpressionBlend2で作成したrectangle図形stroke色のC#での判定方法について RRS feed

  • 質問

  • 環境:SilverLight2+DeVeloper2008(C#)+ExpressionBlend2

    はじめまして。いろいろと情報参考にさせていただいております。ありがとうございます。

    最近この環境で使いはじめて正常にいかなくていろいろと調べたのですが、よくわからなかったため質問させていただきます。

    内容:ExpressionBlend2で作成した、rectangle図形のstrokeの色をC#で判断したいのですが判定がtrueになりません。
        判定方法に誤りがあるのでしょうか?


    コード(抜粋):
    //赤コードセット
    SolidColorBrush mySolidColorBrush = new SolidColorBrush();
    mySolidColorBrush.Color = Color.FromArgb(255, 255, 0, 0);
    // 枠は赤か?
    if (Color.Equals(Content_rectangle.Stroke, mySolidColorBrush.Color) == true)
    {
                    //白枠とする。
                    mySolidColorBrush = new SolidColorBrush();
                    mySolidColorBrush.Color = Color.FromArgb(255, 255, 255, 255);
                    Content_rectangle.Stroke = mySolidColorBrush;

    else
    {
                    //赤枠とする。
                    mySolidColorBrush = new SolidColorBrush();
                    mySolidColorBrush.Color = Color.FromArgb(255, 255, 0, 0);
                    Content_rectangle.Stroke = mySolidColorBrush;
    }


    補足:Content_rectangle.Strokeの色はクリックしたときに赤枠ならば白枠をセットし、白枠ならば赤枠をセットとするものです。実行すると赤枠なのに、else側を通ってしまいます。(白枠時は赤枠側を通ります)

    初心者的な質問で申し訳ありませんが、よろしくお願いいたします。
    2009年3月23日 2:41

回答

  •  StrokeにSolidColorBrushしか使わないのであれば、SolidColorBrushにキャストしてColor値を取得すれば良いです。

    >if(Color.Equals(Content_rectangle.Stroke, mySolidColorBrush.Color) == true)
    if(Content_rectangle.Stroke is SolidColorBrush && mySolidColorBrush.Color.Equals((Content_rectangle.Stroke as SolidColorBrush).Color) == true)
    に変更すればよいと思います

    # ↑の例は、一応SolidColorBrushかチェックしています。
    • 回答としてマーク micchel 2009年3月24日 9:16
    2009年3月24日 8:40
  • 本筋と外れますが、気になったのでレスをつけておきます。

    chamaro さん の発言:

     StrokeにSolidColorBrushしか使わないのであれば、SolidColorBrushにキャストしてColor値を取得すれば良いです。

    >if(Color.Equals(Content_rectangle.Stroke, mySolidColorBrush.Color) == true)
    if(Content_rectangle.Stroke is SolidColorBrush && mySolidColorBrush.Color.Equals((Content_rectangle.Stroke as SolidColorBrush).Color) == true)
    に変更すればよいと思います


    is演算子でチェックして、その直後にas演算子でキャストするのは効率が良くありません。
    is演算子もas演算子もILの上ではほぼ同等なので、二回キャストしていることになります。

    as演算子を使うのであれば一時変数に代入してそれがnullかどうかで分岐させた方が良いと思います。
    また、必ずその型であるとわかりきっているのであればキャスト式、(SolidColorBrush)を使うべきだと思います。

    ※注:この話はあくまでas演算子が使える参照型の場合に限られます。

    ■as演算子だけにする(isを使わないパターン)
    SolidColorBrush brush = Content_rectangle.Stroke as SolidColorBrush;
    if(brush != null && mySolidColorBrush.Color.Equals(brush.Color) == true)

    ■必ずキャストが成功するはずなのでキャスト式にする(キャストに失敗するはずがないのに失敗するのだから例外として検知できるようにする)
    if (mySolidColorBrush.Color.Equals(((SolidColorBrush)Content_rectangle.Stroke).Color) == true)


    参考
    http://blogs.wankuma.com/naka/archive/2007/07/10/84641.aspx
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク micchel 2009年3月25日 1:40
    2009年3月24日 14:27
  • Azulean の発言:

    ■必ずキャストが成功するはずなのでキャスト式にする(キャストに失敗するはずがないのに失敗するのだから例外として検知できるようにする)
    if (mySolidColorBrush.Color.Equals(((SolidColorBrush)Content_rectangle.Stroke).Color) == true)

    Color.Equals(Color,Color)はないのにColor.Equality()はあるという。なんだかなぁ…。

    if( mySolidColorBrush.Color == ((SolidColorBrush)Content_rectangle.Stroke).Color )
    • 回答としてマーク micchel 2009年3月25日 1:40
    2009年3月24日 14:57
  • Azuleanさん の発言:

    is演算子でチェックして、その直後にas演算子でキャストするのは効率が良くありません。
    is演算子もas演算子もILの上ではほぼ同等なので、二回キャストしていることになります。


    ご配慮ありがとうございます、認識していますが
    見易さの為と1行で書きたかったので is/asで記載しました。
    # 形はどうあれキャストすれば良いというのが伝えたかった
    # 後の書き方は、質問者さんに託しました。

    本筋からずれたついで?にもう一つずれると
    mySolidColorBrushの一番最初のnewも不要ですね

    if(Color.FromArgb(255, 255, 0, 0) == ((SolidColorBrush)Content_rectangle.Stroke).Color)
    とか
    if(Colors.Red == ((SolidColorBrush)Content_rectangle.Stroke).Color)
    の方が良いような気がします。

    # 不要なSolidColorBrushを作らない
    # 条件がひと目で分る (赤色がifで、その他がelse)
    # という観点から


    • 回答としてマーク micchel 2009年3月25日 1:40
    2009年3月25日 1:01

すべての返信

  •  System.Web.Media.Color.Equals(Color, Color) は、エラーになっていませんか?手元の、Silverlight 用 MSDN Library では、このメソッドは定義されてないんだけどなぁ?WPF 用にはあります。

    また、あったとして、System.Windows.Shape.Stroke は、Brush なので、Color には変換不可能で、やはりコンパイル エラーになると思うんだけどなぁ?


    if (Content_rectangle.Stroke.Equals(mySolidColorBrush) == true) とすると、どうなりますか?


    Jitta@わんくま同盟
    2009年3月24日 0:49
  •  横レス失礼します。

    私の環境ではColorにEqualsでてきますし引数がObject型ですので上記の例ではコンパイルエラーにはなりませんね。

    質問の回答としては「StrokeはBrush型」というのが全てですね。
    白枠時には正しく動いているように見えているだけで実際はただElse側に流れているだけです。

    失礼しました。
    2009年3月24日 6:47
  •  Jitta様
    nk9k様

    ご回答ありがとうございます。

    いろいろと変えながら実行して残ったソースをのせたため、型が不一致のようですね。
    (自分の環境でもコンパイルエラーにはなりません。)
    Brush型での判定方法がよくわからなかったため、いろいろと実行してEqualsを見つけて使ってみて駄目だったというところでした。書き方が悪くてすみません。

    特別Equalsを使用する必要はないので、質問としては以下の方がわかりやすいですね。


    Brush型の色判定方法は、どうやって行えばよいでしょうか?

    以上よろしくお願いいたします。
    2009年3月24日 7:56
  • あーColor.Equals(Color,Color)が見つからなかったためにObject.Equals(Object,Object)が解決してしまったと…
    2009年3月24日 8:36
  •  StrokeにSolidColorBrushしか使わないのであれば、SolidColorBrushにキャストしてColor値を取得すれば良いです。

    >if(Color.Equals(Content_rectangle.Stroke, mySolidColorBrush.Color) == true)
    if(Content_rectangle.Stroke is SolidColorBrush && mySolidColorBrush.Color.Equals((Content_rectangle.Stroke as SolidColorBrush).Color) == true)
    に変更すればよいと思います

    # ↑の例は、一応SolidColorBrushかチェックしています。
    • 回答としてマーク micchel 2009年3月24日 9:16
    2009年3月24日 8:40
  • chamaro様

    ご回答ありがとうございます。

    上記ロジックにて無事正常な判断が可能となりました。

    ありがとうございました。

    以上
    2009年3月24日 9:14
  • 本筋と外れますが、気になったのでレスをつけておきます。

    chamaro さん の発言:

     StrokeにSolidColorBrushしか使わないのであれば、SolidColorBrushにキャストしてColor値を取得すれば良いです。

    >if(Color.Equals(Content_rectangle.Stroke, mySolidColorBrush.Color) == true)
    if(Content_rectangle.Stroke is SolidColorBrush && mySolidColorBrush.Color.Equals((Content_rectangle.Stroke as SolidColorBrush).Color) == true)
    に変更すればよいと思います


    is演算子でチェックして、その直後にas演算子でキャストするのは効率が良くありません。
    is演算子もas演算子もILの上ではほぼ同等なので、二回キャストしていることになります。

    as演算子を使うのであれば一時変数に代入してそれがnullかどうかで分岐させた方が良いと思います。
    また、必ずその型であるとわかりきっているのであればキャスト式、(SolidColorBrush)を使うべきだと思います。

    ※注:この話はあくまでas演算子が使える参照型の場合に限られます。

    ■as演算子だけにする(isを使わないパターン)
    SolidColorBrush brush = Content_rectangle.Stroke as SolidColorBrush;
    if(brush != null && mySolidColorBrush.Color.Equals(brush.Color) == true)

    ■必ずキャストが成功するはずなのでキャスト式にする(キャストに失敗するはずがないのに失敗するのだから例外として検知できるようにする)
    if (mySolidColorBrush.Color.Equals(((SolidColorBrush)Content_rectangle.Stroke).Color) == true)


    参考
    http://blogs.wankuma.com/naka/archive/2007/07/10/84641.aspx
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク micchel 2009年3月25日 1:40
    2009年3月24日 14:27
  • Azulean の発言:

    ■必ずキャストが成功するはずなのでキャスト式にする(キャストに失敗するはずがないのに失敗するのだから例外として検知できるようにする)
    if (mySolidColorBrush.Color.Equals(((SolidColorBrush)Content_rectangle.Stroke).Color) == true)

    Color.Equals(Color,Color)はないのにColor.Equality()はあるという。なんだかなぁ…。

    if( mySolidColorBrush.Color == ((SolidColorBrush)Content_rectangle.Stroke).Color )
    • 回答としてマーク micchel 2009年3月25日 1:40
    2009年3月24日 14:57
  • Azuleanさん の発言:

    is演算子でチェックして、その直後にas演算子でキャストするのは効率が良くありません。
    is演算子もas演算子もILの上ではほぼ同等なので、二回キャストしていることになります。


    ご配慮ありがとうございます、認識していますが
    見易さの為と1行で書きたかったので is/asで記載しました。
    # 形はどうあれキャストすれば良いというのが伝えたかった
    # 後の書き方は、質問者さんに託しました。

    本筋からずれたついで?にもう一つずれると
    mySolidColorBrushの一番最初のnewも不要ですね

    if(Color.FromArgb(255, 255, 0, 0) == ((SolidColorBrush)Content_rectangle.Stroke).Color)
    とか
    if(Colors.Red == ((SolidColorBrush)Content_rectangle.Stroke).Color)
    の方が良いような気がします。

    # 不要なSolidColorBrushを作らない
    # 条件がひと目で分る (赤色がifで、その他がelse)
    # という観点から


    • 回答としてマーク micchel 2009年3月25日 1:40
    2009年3月25日 1:01
  •  Azulean 様
    佐祐理 様
    chamaro 様

     ご回答ありがとうございます。

    やり方いろいろあるのですね。
    あまりC#が慣れていないのもあるのでしょうけど、キャストは初めに試してみたうまくいかなかったので、たぶん何かがちがかったのでしょうね・・。
    すべてのソース試して参考とさせていただきます。
    ありがとうございました。

    ふと疑問に思ったのですが(うまくつたわらなかったらすみません)、
    上記内容はC#ですが、silverlightでのC#は通常のC#とは違うとどこかの説明サイトにあったのですが、どういう 違いがあるのでしょうか?
    silverlightのC#の本はあまり無いようですので、通常のC#の参考書を買ってしまってよいのか、いまいちわからなかったもので・・。
    2009年3月25日 1:21
  • 尋ねたいと思っていらっしゃることを正確に把握したかどうか自信がありませんが。

    どうも、実装とドキュメントが一致していないようです。C# 言語仕様の違いではないことは確かで、ドキュメントのミス、あるいは実装ミスのどちらかであると思われます。
    Jitta@わんくま同盟
    2009年3月25日 13:50
  •  Jitta 様

    ご回答ありがとうございます。

    どっちのミスでも大変ですね・・。

    とりあえず参考書かってみます。

    ありがとうございました。
    2009年3月26日 2:34