locked
塗りつぶしと破線(点線)描画方法について RRS feed

  • 質問

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

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


    3点ほど質問させていただきます。

    ①polygonで塗りつぶしのパターン(斜線)は、なにか実現方法はあるのでしょうか?(ベータ版ではなかったとありましたが・・)

    ②Lineで線を描画するとき、点線としたいので下記としたのですが、エラーとなってしまいます。
     いろいろなHPで同じ感じでやっているようなのですが、理由がわかりません。どこかに間違いはあるのでしょうか?
     (エラーの内容的には、引数使用できない・・?)
     【コード(当該箇所のみ抜粋)】
          Line N_Line = new Line();
       N_Line.StrokeDashArray = new DoubleCollection(new double[] { 1, 1 });
     【エラー内容】
       'System.Windows.Media.DoubleCollection' に、引数を '1' 個指定できるコンストラクタがありません。 

    ③デバックで実行し、IEで表示させるのですが、ブラウザのスクロールバーが出てこないので、下に移動することができません。
     表示させるためには、何か定義が必要なのでしょうか?(ローカルのブラウザ設定とかあるのでしょうか・・)


    以上よろしくお願いいたします。
    2009年3月27日 1:51

回答

  • 1.Brush クラスの派生クラスに、線のパターンによる塗りつぶしはないので、無いのでしょう。代わりと言ってはなんですが、線のパターンを表現した小さなグラフィックを作って、ImageBrush クラスを使って塗りつぶすというのはどうでしょう?

    2.エラー メッセージの通りです。→DoubleCollection クラスのコンストラクタ

    3.HTML と XAML には、どのように書いてあるのでしょう?


    Jitta@わんくま同盟
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月30日 3:04
  • DoubleCollection dc = new DoubleCollection();
    dc.Add(1.0);
    dc.Add(1.0);
    plgn.StrokeDashArray = dc;
    とやるか、そのままAddすればできますが、勘違いしてますかね俺。
    plgn.StrokeDashArray.Add(1.0);
    plgn.StrokeDashArray.Add(1.0);
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月30日 7:56
  • DoubleCollection dc = new DoubleCollection();
    dc.Add(1.0);
    dc.Add(1.0);
    plgn.StrokeDashArray = dc;
    とやるか、そのままAddすればできますが、勘違いしてますかね俺。
    plgn.StrokeDashArray.Add(1.0);
    plgn.StrokeDashArray.Add(1.0);

    ちょっとだけ、ね。
    .NET Framework には DoubleCollection(IEnumerable<Double>) が定義されていますが、Silverlight 用には定義されていない、って問題です。(ドキュメントと実装がずれていなければ)
    Jitta@わんくま同盟
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月30日 8:11
  • 未確認で回答します。ご容赦ください。

    3番に関してですがおそらくCanvasを使用しているのではないでしょうか?
    Canvasは自分の子にサイズを左右されない特性があったような気がします。
    Canvas自体がWidth,Height共に0だったとしてもCanvas.Left=100,Canvas.Top=100とか置けます。
    例えばGridとCanvasにそれぞれ同じ大きさの何らかのオブジェクトを乗せた時に
    GridとCanvasのHorizontalAlignmentをStretchとCenterに切り替えてどう動くか見てみると
    言っている意味がわかるかと思います。

    Canvasが実行時にブラウザの描画可能領域にしか拡がらないためブラウザのスクロールバーが出ないのだと思います。

    回避方法としては、htmlもしくはaspxにSilverlightの領域を指定しているタグがありますので
    そこに必要サイズをセットしてください。(初期値は100%)

    現状が上記にあてはまらないようでしたら見等違いですのでスルーしてください。
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月31日 8:19

すべての返信

  • 1.Brush クラスの派生クラスに、線のパターンによる塗りつぶしはないので、無いのでしょう。代わりと言ってはなんですが、線のパターンを表現した小さなグラフィックを作って、ImageBrush クラスを使って塗りつぶすというのはどうでしょう?

    2.エラー メッセージの通りです。→DoubleCollection クラスのコンストラクタ

    3.HTML と XAML には、どのように書いてあるのでしょう?


    Jitta@わんくま同盟
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月30日 3:04
  • DoubleCollection dc = new DoubleCollection();
    dc.Add(1.0);
    dc.Add(1.0);
    plgn.StrokeDashArray = dc;
    とやるか、そのままAddすればできますが、勘違いしてますかね俺。
    plgn.StrokeDashArray.Add(1.0);
    plgn.StrokeDashArray.Add(1.0);
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月30日 7:56
  • DoubleCollection dc = new DoubleCollection();
    dc.Add(1.0);
    dc.Add(1.0);
    plgn.StrokeDashArray = dc;
    とやるか、そのままAddすればできますが、勘違いしてますかね俺。
    plgn.StrokeDashArray.Add(1.0);
    plgn.StrokeDashArray.Add(1.0);

    ちょっとだけ、ね。
    .NET Framework には DoubleCollection(IEnumerable<Double>) が定義されていますが、Silverlight 用には定義されていない、って問題です。(ドキュメントと実装がずれていなければ)
    Jitta@わんくま同盟
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月30日 8:11
  • Jitta 様
    ritto 様

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

    >1.Brush クラスの派生クラスに、線のパターンによる塗りつぶしはないので、無いのでしょう。代わりと言ってはなんですが、線の>パターンを表現した小さなグラフィックを作って、ImageBrush クラスを使って塗りつぶすというのはどうでしょう?
    なるほど、やはりないのですね。
    代替案、大変そうなきもしますが、いけそうな感じですね。いろいろ試して納得いくものができるかやってみます。


    >2.エラー メッセージの通りです。→DoubleCollection クラスのコンストラクタ
    たぶん参考にしたのが、.NET Frameworkのサンプルだったのでしょうね。(引数ありましたので・・)
    rittoさんの方法でうまくいきました。サンプルありがとうございました。
    まだ、いくつかやり方があるのでしょうけど、自分がまだ代替を考えられるレベルではないのがつらいですね。純粋にC#を理解していけば普通になるのでしょうか・・(不安;;)。

    >3.HTML と XAML には、どのように書いてあるのでしょう?
    XAMLのどのあたりに、というかどういう風に記載されるのでしょうか・・?

    ブラウザの自体のスクロールバーの表示が灰色(使用できない状態)であったため、使用できるのかなと思って質問してみました。
    全体をScrollViewerで囲うならばいけるとは思うのですが、それが必要性かはわからなかったもので・・。(見た目悪くなりますし)

    2009年3月31日 8:17
  • 未確認で回答します。ご容赦ください。

    3番に関してですがおそらくCanvasを使用しているのではないでしょうか?
    Canvasは自分の子にサイズを左右されない特性があったような気がします。
    Canvas自体がWidth,Height共に0だったとしてもCanvas.Left=100,Canvas.Top=100とか置けます。
    例えばGridとCanvasにそれぞれ同じ大きさの何らかのオブジェクトを乗せた時に
    GridとCanvasのHorizontalAlignmentをStretchとCenterに切り替えてどう動くか見てみると
    言っている意味がわかるかと思います。

    Canvasが実行時にブラウザの描画可能領域にしか拡がらないためブラウザのスクロールバーが出ないのだと思います。

    回避方法としては、htmlもしくはaspxにSilverlightの領域を指定しているタグがありますので
    そこに必要サイズをセットしてください。(初期値は100%)

    現状が上記にあてはまらないようでしたら見等違いですのでスルーしてください。
    • 回答としてマーク micchel 2009年3月31日 8:46
    2009年3月31日 8:19
  • nk9k 様

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

    gridを使用していたりするのですが、
    appxを Width="1024" Height="756" にしたら無事スクロールバーを出すことができました。

    上記が今の解像度なのですが、100%をやめたということは、たとえば、1280×1024で実行したらうまくいかなかったりするんでしょうかね・・。
    ただ、画面は上記のサイズで作成したので、左上にいる感じになるのでしょうね。

    ありがとうございました。
    2009年3月31日 8:44