2016年2月22日 星期一

[.NET/WPF] 屬性'Content'設定了一次以上。

說明:
編輯WPF的xaml,使用GroupBox編輯控制項出現該錯誤。


原因:
GroupBox內只能有一個element,因此無論Panel或Grid都只能放一個,可以在Panel或Grid內放入子element即可。例:
<GroupBox>
   <StackPanel>
      <UniformGrid></UniformGrid>
      <Grid>
         <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
         </Grid.RowDefinitions>
      </Grid>
   </StackPanel>
</GroupBox>


參考資料:
http://stackoverflow.com/questions/1356036/groupbox-in-wpf-can-only-contain-one-element

2016年2月16日 星期二

[Visual Studio] 如何自動同步程式發行版本與最小必要版本? (強制更新發行程式) / minimum required version auto-increment in the clickonce deployment

說明:
使用clickonce發行程式安裝檔,想強制更新client程式,需指定最小必要版本,因發行版本可自動遞增,如何讓最小必要版本同步發行版本? 讓client程式可自動更新。


做法:
1. 方案總管中的專案圖示 -> 右鍵 -> 卸載專案
2. 一樣專案圖示  -> 右鍵 -> 編輯xxx.csproj
3. 在<Project>與</Project>的tag中插入以下設定:
<Target Name="AutoSetMinimumRequiredVersion" BeforeTargets="GenerateDeploymentManifest">
  <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
    <Output PropertyName="MinimumRequiredVersion" TaskParameter="OutputVersion"  />
  </FormatVersion>
  <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
    <Output PropertyName="_DeploymentBuiltMinimumRequiredVersion" TaskParameter="OutputVersion"  />
  </FormatVersion>
</Target>
設定是將ApplicationVersion(如: 1.0.0.%2a)與ApplicationRevision(修訂號,如: 2)合併成最終發行版號,寫入最小必要版本,再寫入部署資訊清單內的最小必要版本屬性。

4. 儲存並關閉csproj -> 發行後檢視部署資訊清單(xxx.application) -> 檢視minimum required version是否有值且正確。


參考資料:
http://stackoverflow.com/questions/202491/automatically-increment-minimum-required-version-in-a-clickonce-deployment
http://stackoverflow.com/questions/202491/automatically-increment-minimum-required-version-in-a-clickonce-deployment

2016年2月4日 星期四

[.NET] DateTimeOffset與DateTime的差異/ What's the difference between DateTimeOffset and DateTime

說明:在.NET framework中用來處理日期與時間的class有DateTimeOffset跟DateTime,究竟差在哪?


說明:

DateTime:好像最直覺用來處理時間的class,但有下列缺點:
● 轉UTC或LocalTime時,可能會與預期不符,如:
DateTime dt = new DateTime(2016,2,4,22,0,0);
dt.ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss");   //顯示為2016/2/5 06:00:00

這是因為DateTime內只儲存Ticks(從0001/1/1起的時間單位)跟Kind,此時Kind為Unspecified,呼叫ToLocalTime()將dt視為UTC時間,依據本地電腦時區+8,因此出現該情形。若改為:
DateTime dt = DateTime.Now;   //Kind為Local,代表本地時間,ToLocalTime()就ok。

● DateTime.CompareTo(),不會考慮時區,單純比較Ticks。


DateTimeOffset:特定時間需指定時區offset,如:
DateTimeOffset dt = new DateTimeOffset(2016,2,4, 22, 0, 0, new TimeSpan(8,0,0));

若有跨時區轉換,用DateTimeOffset是最保險的做法。


參考資料:
http://blogs.msdn.com/b/davidrickard/archive/2012/04/07/system-datetime-good-practices-and-common-pitfalls.aspx