プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

WPFのCanvas上で動くShapeを線でつなぐ

とりあえずこんな感じの奴を用意します

<Canvas>
    <Rectangle x:Name="Rect1" Width="50" Height="50" Fill="Cyan" Canvas.Left="0" Canvas.Top="0"/>
    <Ellipse x:Name="Ellipse1" Width="50" Height="50" Fill="Magenta" Canvas.Left="200" Canvas.Top="200"/>
    <Line x:Name="Line1" StrokeThickness="5" Stroke="Blue" X1="0" X2="200" Y1="100" Y2="100"/>
</Canvas>

Rect1はStoryboardでびよびよ動かして、Ellipse1はマウスのドラッグアンドドロップで動くようにします

f:id:puni-o:20160921135656g:plain

こんな感じ

このRect1とEllipse1の中心をLine1で結ぶのが今回のお題

使うのはこれです

CompositionTarget.Rendering イベント (System.Windows.Media)

MSDNによるとレンダリングの直前に呼ばれるイベントだそうです。 ということでこの時のそれぞれの座標を取得してLine1のプロパティ変えれば逝けますね

public MainWindow()
{
    InitializeComponent();
    CompositionTarget.Rendering += CompositionTarget_Rendering;
}

private void CompositionTarget_Rendering(object sender, EventArgs e)
{
    Line1.X1 = Canvas.GetLeft(Rect1) + Rect1.ActualWidth / 2;
    Line1.Y1 = Canvas.GetTop(Rect1) + Rect1.ActualHeight / 2;
    Line1.X2 = Canvas.GetLeft(Ellipse1) + Ellipse1.ActualWidth / 2;
    Line1.Y2 = Canvas.GetTop(Ellipse1) + Ellipse1.ActualHeight / 2;
}

実行結果はこんな感じ

f:id:puni-o:20160921140513g:plain

ちなみにMSDNにも書いてある通りSilverlightでもこのイベントは拾えますよ

goto文の使い道

バグの原因になるからと避けていたり、よほどのことが無い限り使わなくなったgoto文ですが、昔の私が変なもの書いていたのでブログネタに

C#のコンソールアプリで

static void Main(string[] args)
{
    for (var i = 0; i < 4; i++)
    {
        Console.WriteLine($"\nFunc({i})");
        Func(i);
    }
    Console.ReadLine();
}

static void Func(int i)
{
    switch (i)
    {
    case 0:
        Console.WriteLine("case 0:");
        break;
    case 1:
        Console.WriteLine("case 1:");
        goto case 0;
    case 2:
        Console.WriteLine("case 2:");
        goto default;
    default:
        Console.WriteLine("default:");
        break;
    }
}

と書いて実行します

結果はこんな感じ

Func(0)
case 0:

Func(1)
case 1:
case 0:

Func(2)
case 2:
default:

Func(3)
default:

MSDNにもswitch-caseラベルに移動できるって書いてありました

goto (C# リファレンス)

知らなかった(過去に私はこれを使っているようなので忘れていたが正解)

まぁ・・・つかわないですよねー

ASP.NETのWeb APIが吐くJSONをlower camelケースにしたい

いつものことですがちゃんと確認していません。

ASP.NET MVC5(4?)での話です。

Web APIのGetとかはクラスをそのまま返せばあとはASP.NETが勝手にJSONにして返してくれますよね。

public class Person
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

public class PersonController : ApiController
{
    public Person Get()
    {
        return new Person{FirstName="Hoge",LastName="hoge"};
    }
}

/api/person

{
"FirstName":"Hoge",
"LastName":"hoge"
}

非常に便利なんですがプロパティ名がUpper camelなのが気になりますね。JSONはLower camelが一般的っぽいですから。(ちなみに私はPascal case/Camel caseではなくUpper camel/Lower camelを好んで使っています)

クラスのプロパティをLower camelにすればいいのかもしれませんが、そうすると今度はR#先生が怒るのでこれは避けたいところです。

ということでおまじない

protected void Application_Start()
{
    // いろいろ

    GlobalConfiguration.Configuration
      .Formatters
      .JsonFormatter
      .SerializerSettings
      .ContractResolver = new CamelCasePropertyNamesContractResolver();
}

Webアプリの起動時(上の例ではGlobal.asax.cs)にこんな感じにしてあげるとJSON.NET君がLower camelでJSONを吐いてくれるようになります。

{
"firstName":"Hoge",
"lastName":"hoge"
}

ちなみに実際に動かして確認していないので事実と異なるところがあるかもしれませんが、おまじないの部分はStack Overの回答をコピペしたので間違いないと思います

おしまい