
ãã®ã¬ã€ãã¯ãã¢ããªã±ãŒã·ã§ã³ã§å¯èœãªéãé®®æãªç»åãååŸããããšããŠããWPFéçºè
ã察象ãšããŠããŸãã 骚ã®éªšé«ãžã®ã°ã©ãã£ãã¯ã·ã¹ãã WPFã¯ãã¯ãã«ã§ããããã®äœæ¥ã®æçµçµæã¯äŸç¶ãšããŠã©ã¹ã¿ãŒã§ãã ãã®äºå®ã«ååãªæ³šæãæããªããšãããŸããŸãªçš®é¡ã®ãç³é¹žããã€ãŸãã©ã¹ã¿ãŒåã®å¯çã¢ãŒãã£ãã¡ã¯ããçºçããå¯èœæ§ããããŸãã ãã®ãããªç¶æ³ã§ã¯ãå¿ã®ååšã倱ããªãããšãéèŠã§ããããã®çºçã®çç±ã¯éåžžã«åççã§ãããéäºã®æ¹æ³ã¯éåžžã«ã·ã³ãã«ã§å¹æçã§ãã
ç®æ¬¡
ã¯ããã«1.ã©ã¹ã¿ãŒç»åã®ã¹ã±ãŒãªã³ã°2.ãã¯ã»ã«ãµã€ãºã®åæ°ã§ã¯ãªã座æš3.ã©ã¹ã¿ãŒç»åã®ãã€ãã£ãè§£å床4.ãã¯ã¿ãŒç»åã®ã©ã¹ã¿ã©ã€ãº5.ããã¹ããåçŽã«ç§»åãã6. SnapsToDevicePixelsããããã£ã®äœ¿çš7.èªå·±æç»ã³ã³ãããŒã«ãããã«åç
§è³æã¯ããã«
ã©ã¹ã¿ã©ã€ãŒãŒã·ã§ã³ã¢ãŒãã£ãã¡ã¯ãã®é°æ¹¿æ§ã¯ãããããç®ç«ããªããšããäºå®ã«ãããŸãã å€ãã®éçºè
ã¯ã1ãã¯ã»ã«ãŸãã¯2ãã¯ã»ã«ã®ãµã€ãºã®æ¬ é¥ã«æ°ä»ããªãã ãã§ãã ãã ãããããã®ããããªããšãã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«åœ±é¿ããŸãã
泚æåã®å°ããªãã¹ãïŒ
ããã«ãäžã®å³ãšäžã®å³ãåºå¥ããèŠå ãããã³ããããé€å»ããæ¹æ³ã«ã€ããŠèª¬æããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ãã®ãããªåé¡ããªãå Žåã¯ãWindowsèšå®ã§ããã¹ããšã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãå¢ããã¢ãŒãããªã³ã«ããŠã¿ãŠãã ãããã»ãšãã©ã®å Žåãåé¡ãçºçããŸãã ãã®æ©èœã¯ãé«è§£å床ã®å°ããªç»é¢ãŸãã¯åŒ±èŠã®äººã ãããã䜿çšããŸãããã¹ãŠããã¹ãŠèªãå¿
èŠã¯ãããŸãããã€ã©ã¹ãã®è¡šç€ºã«å¶éããããšãã§ããŸãã ããããããããèŠããŠãããã¢ããªã±ãŒã·ã§ã³ã®ã°ã©ãã£ãã¯åºåãæç¢ºã«ããããã«æ¬åœã«æŠãå¿
èŠãããå Žåã¯ããã®ã¬ã€ãã«æ»ããŸãã
ããã¥ã¢ã«ã®åã»ã¯ã·ã§ã³ã«ã¯ãåé¡ã®åé¡ãšãã®è§£æ±ºæ¹æ³ã瀺ããã¢ã¢ããªã±ãŒã·ã§ã³ãåãã£ãŠããŸãã ã³ã³ãã€ã«ãããã¢ãžã¥ãŒã«ãšãã®ãœãŒã¹ã³ãŒãïŒVS2010ãããžã§ã¯ã圢åŒïŒãå«ã
åäžã®ã¢ãŒã«ã€ãïŒ104 KbïŒã§ãã¹ãŠãããŠã³ããŒãã§ããŸãã
ããã§ã¯ãWPFã¯ã©ãããæ¥ãŠãã©ã®ããã«å¯ŸåŠããã®ã§ããããïŒ
1.ã©ã¹ã¿ãŒç»åã®ã¹ã±ãŒãªã³ã°
ããããããç»åã§äœæ¥ããå ŽåããŒããã®æãäžè¬çãªåå ã¯åºåäžã®ã¹ã±ãŒãªã³ã°ã§ãã
ç»åã®ç©ççãªãµã€ãºãšäžèŽããªã
ç»åèŠçŽ ã®ãµã€ãºãæå®ãããšãçµæã¯ãœãŒã¹ã«äŒŒãªããªããŸãã ã€ã¡ãŒãžãµã€ãºãã³ã³ãããµã€ãºã«èªåçã«èª¿æŽãããšãå€ãã®å Žåãåæ§ã®çµæã«ãªããŸãã ãã®å Žåãã¢ãŒãã£ãã¡ã¯ããçºçããçç±ã¯ãããã©ã¹ã¿ã°ãªããããå¥ã®ã©ã¹ã¿ã°ãªããã«ç»åã転éããå¿
èŠãããããã§ãã
察æ
ç»åãã¹ã±ãŒãªã³ã°ã³ã³ãããŒã«èª€ã£ãŠè¡šç€ºãããå Žåã¯ãããããåãåºãå¿
èŠããããŸãã ç»åã®å¯žæ³ãæ£ãããªãå Žåã¯ã調æŽããå¿
èŠããããŸãã ãã¹ãŠãã·ã³ãã«ã§ãã ãã ããæšæºèšå®ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããå Žåã«éããŸãã Windowsã§æ¡å€§ãã©ã³ããšã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã®ã¢ãŒããæå¹ã«ãããšãWPFã¢ããªã±ãŒã·ã§ã³ã®åºåã®è§£å床ãå€ãããä»®æ³æž¬å®åäœããã¯ã»ã«ãµã€ãºããã倧ãããªããããããããã€ã¡ãŒãžãã¹ãã¬ããã«ãã£ãŠçµ¶æçã«ç ŽæããŸãã
ãã倧ããªãã©ã³ãã䜿çšãããŠãŒã¶ãŒåãã®ç»åã¹ã±ãŒãªã³ã°ãèšç»ã«å«ãŸããŠããªãå Žåã¯ããã®å Žã§ä¿®æ£ããå¿
èŠããããŸãã æåã«ãåºåã®çŸåšã®è§£ååºŠãšæšæºãšã®é¢ä¿ã調ã¹ãå¿
èŠããããŸãã ããšãã°ã次ã®ããã«ïŒ
public static class Render { static Render() { var flags = BindingFlags.NonPublic | BindingFlags.Static; var dpiProperty = typeof(SystemParameters).GetProperty("Dpi", flags); Dpi = (int)dpiProperty.GetValue(null, null); PixelSize = 96.0 / Dpi; }
次ã«ãåºåã®çŸåšã®è§£å床ã«å¿ããŠãæšæº
ç»åã®åŸç¶ã§ç»åã®å¯žæ³ãåå¥ã«èšå®ã§ããŸãã XAMLã§ã¯ããã®ãããªç»åã¯ç¹å®ã®ãµã€ãºãæå®ããã«é
眮ããå¿
èŠããããŸãã
public class StaticImage : Image { static StaticImage() {
ã¹ã±ãŒãªã³ã°ãåé¿ã§ããªãå Žåã
RenderOptions.BitmapScalingModeããããã£ã䜿çšããŠãã±ãŒã¹ã«é©ããåºåã¢ã«ãŽãªãºã ãéžæããããšã«ãããæªã¿ã®çšåºŠãæžããããã«æŠãã ãã§ãã
2.ãã¯ã»ã«ãµã€ãºã®åæ°ã§ã¯ãªã座æš
èšç»å€ã®ãŒãããäœæããããªãç°¡åãªæ¹æ³ã¯ãã³ã³ããå
ã®
ç»åãäžå€®ã«é
眮ããããšã§ãïŒ
åè§åœ¢ãä»ã®
Shapeã®åå«ã§ãæ©èœããŸãïŒã ååã®å Žåãã³ã³ããã®å¹
ã¯å®å
šã«ååã«åå²ãããŠããŸããã
ãã ããã»ã³ã¿ãªã³ã°ããã«å®è¡ã§ããŸãã ããšãã°ã
ã°ãªããã³ã³ããã䜿çšãããšãä»»æã®å²åã§èªåèªèº«ãããŒãã«åå²ã§ããŸãã å·Šäžã®ã»ã«ã§ãã¹ãŠãæ£åžžã§ãããå³äžã®ã»ã«ã§é§ããããæ®ããä»ã®äœãã§ããå
žåçãªã±ãŒã¹ã次ã«ç€ºããŸãã
<Grid Width="117" Height="117"> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.Resources> <Style TargetType="Image"> <Setter Property="Width" Value="48"/> <Setter Property="Height" Value="48"/> <Setter Property="Margin" Value="5"/> <Setter Property="VerticalAlignment" Value="Top"/> <Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="Source" Value="CookingPot.png"/> </Style> </Grid.Resources> <Image Grid.Column="0" Grid.Row="0"/> <Image Grid.Column="1" Grid.Row="0"/> <Image Grid.Column="0" Grid.Row="1"/> <Image Grid.Column="1" Grid.Row="1"/> </Grid>
ãã£ã³ãã¹ã®ã€ã³ãã³ããŸãã¯ãã¯ã»ã«ã®ãµã€ãºã®åæ°ã§ã¯ãªãäœçœ®ã«ã¿ã¹ã¯ã®ç»åãå¡ãä»ããã®ã«å¹æçã§ãã
ãããã®ãã¹ãŠã®å Žåãåºåäžã«ã¹ã±ãŒãªã³ã°ãçºçããªããŠãããç³é¹žããåŸãããŸãã ç»åã®ãã¯ã»ã«ã®å¢çã¯ãç»é¢ã®ãã¯ã»ã«ã®å¢çå
ã«åãŸãããã©ã¹ã¿ã©ã€ãºããããšå¡ãã€ã¶ãããŸãã
察æ
ã³ã³ããã®å Žåããã¹ãŠãã·ã³ãã«ã§ã
ãUseLayoutRoundingããããã£ã
Trueã«èšå®ãããšãã³ã³ããïŒ
Windowãå«ãïŒ
ãåã®äœçœ®ãæãè¿ãæŽæ°ãã¯ã»ã«å€ã«èªåçã«äžžããŸãã ãã以å€ã®å Žåã¯ãäœããã®æ¹æ³ã§åº§æšããã¯ã»ã«ã®å¢çã«æç€ºçã«ãã€ã³ãããå¿
èŠããããŸãã
ãæŽæ°åº§æšããšãã衚çŸã¯ãæšæºè§£å床96 dpiã§ã®ã¿ããã¯ã»ã«ã®ãµã€ãºã§å²ãåãã座æšããæå³ããããšã«æ³šæããŠãã ãããä»ã®ãã¹ãŠã®
Math.Roundã¯åœ¹ã«ç«ã¡ãŸããã äžè¬çãªå Žåãæ¬¡ã®ããã«åº§æšãæãè¿ããã¯ã»ã«å¢çã«äžžããããšãã§ããŸãã
static public double SnapToPixels(double value) { value += PixelSize / 2;
3.ã©ã¹ã¿ãŒç»åã®ãã€ãã£ãè§£å床
ããããããç»åã®ã¹ã±ãŒãªã³ã°ã®åé¡ã«åããŠééãããšãã
Imageã«ã¹ã±ãŒãªã³ã°ãªãã®éæ³ã®åºåã¢ãŒã
ãããå Žå
ã¯ãã»ãšãã©ã®å Žågoogleã詊è¡ããŸãã ãã®ãããªã¢ãŒãããããŸããããã¯
Stretch = "None"ã§ã ãããããããªãã¯å±éºã«ãããããŠããã®ã§ãããã«é Œã£ãŠåºåãµã€ãºã®æç€ºçãªã¿ã¹ã¯ãåé€ããå¿
èŠããããŸãã ã©ã¹ã¿ãŒç»åã«ã¯ç¬èªã®è§£å床ããããã¡ã¿ããŒã¿ã§ç€ºãããWPFã¯ç»åã®å¯žæ³ã圢æãããšãã«ãããèæ
®ããŸãã ãããäœã§ãããããããªãå Žåãäžé£ã®æåããç¶æ³äžã§ãããªãã¯é»éè¡ãä¿¡ããããšãã§ããŸãïŒããªããæã£ãŠããç»åã®ããã€ãã¯æåŸ
ã©ããã«æãããããããšå®å
šã«é¡äŒŒãããã®ã¯åãæ¡ä»¶äžã§èšåŒµãŸãã¯åçž®ããŸãã
å®éšçšã«æ¬¡ã®3ã€ã®ç»åãããŠã³ããŒãããŸãïŒããããè§£å床ãç°ãªããŸãïŒã



ç»åã®è§£å床ãåºåã®è§£å床ãšäžèŽããªãå Žåããã®ãµã€ãºãèªã¿èŸŒããšãã«è§£ååºŠã®æ¯çãä¹ç®ããããå
ã®ããµã€ãºã§ã¬ã³ããªã³ã°ãããšãã«çªç¶ã¹ã±ãŒãªã³ã°ãçºçããŸãã ã¡ãªã¿ã«ãæåã®ã¡ãœããã§ç€ºãã
StaticImageã¯ã©ã¹ã
Source.Widthããã³
Source.Heightããããã£ã«äŸåããŠããããããããã®æªã¿ããä¿è·ãããŠããŸããã
ã°ã©ãã£ãã¯ãšãã£ã¿ãŒããŠã©ããã¡ã³ã¯ãããªãã®ç®ã®åã§ç»åè§£å床ã調æŽããããšã¯ãããŸããã ããã«ããããã®ããã°ã©ã ã®äžéšã¯ãŸã£ãã衚瀺ãããããã®ãã©ã¡ãŒã¿ãŒã倿Žã§ããŸããã ããããããã¯éèŠã§ãã
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Image Grid.Column="0" Source="Man1.png" Stretch="None" Margin="5"/> <Image Grid.Column="1" Source="Man2.png" Stretch="None" Margin="5"/> <Image Grid.Column="2" Source="Man3.png" Stretch="None" Margin="5"/> </Grid>
察æ
ä»®æ³åäœã®ç»åã®ãµã€ãºããã¯ã»ã«åäœã®ãµã€ãºã«å¯Ÿå¿ãããã«ã¯ãã°ã©ãã£ãã¯ãšãã£ã¿ãŒã§è§£å床ã96 dpiã«èšå®ããå¿
èŠããããŸãã è§£å床ã倿ŽããŠãç»åèªäœã«ã¯äœãèµ·ãããŸãããã¡ã¿ããŒã¿ã®ã¿ã倿ŽãããŸãã
æšæºãã€ã³ãã¯ããã«ã¯é©ããŠããŸããããã£ãšæ·±å»ãªãã®ãå¿
èŠã«ãªããŸãã 人æ°ã®ãã
IrfanViewããªãŒãŠã§ã¢ã§ã¯ãç»åããããã£è¡šç€ºãã€ã¢ãã°ïŒãããããŒIïŒã§è§£å床ãèšå®ã§ããŸãã
åæ§ã«ç¡æã®
Paint.NETãšãã£ã¿ãŒã§ã¯ã[ç»å]ã¡ãã¥ãŒã[ãã£ã³ãã¹ãµã€ãº...]ïŒãããããŒCtrl + Shit + RïŒãéžæããããšã§åã广ãåŸãããšãã§ããŸãã
ã°ã©ãã£ã«ã«ãšãã£ã¿ãŒã§è§£å床ã䜿çšããããªãããŸãã¯äœ¿çšã§ããªãå ŽåïŒããšãã°ãã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŒãå¯èœãªã«ã¹ã¿ã ç»åã§åäœããå ŽåïŒãããŠã³ããŒãããç»åã®è§£å床ãããã°ã©ã ã§å€æŽã§ããŸãã 32ãããã€ã¡ãŒãžã®ããŠã³ããŒã颿°ã®äŸã次ã«ç€ºããŸãã
4.ãã¯ã¿ãŒç»åã®ã©ã¹ã¿ã©ã€ãº
ãç³é¹žãã®åºçŸã®æåã®3ã€ã®çç±ã®èª¬æãããWPFã®cããããããã«ã¯1ã€ã®åé¡ããããšããååã«æ ¹æ ã®ããæèŠããããããããŸããã å®éããã¯ã¿ãŒç°å¢ã§äœæ¥ããã«ã¯ããã¯ã¿ãŒç»åã䜿çšããæ¹ãã¯ããã«èªç¶ã§ãã æåã®å®éšã§ã¯ãSVGããXAMLãžã®å€æã¯äžèœè¬ã®ããã§ããããµã€ãºãšãã¯ã»ã«ã«ã€ããŠèããå¿
èŠããªããªããŸããã æ²ããããªãããã¯ããã§ã¯ãããŸããã çå€äžã«ãªããšããã£ãªããžã¯ã«ããã£ã«å€ããããã¯ãã«ç»åã¯è¡šç€ºçšã«ã©ã¹ã¿ã©ã€ãºãããŸãã
åºåã«å«ãŸãããã¯ã»ã«ãå°ãªãã»ã©ãã¢ãŒãã£ãã¡ã¯ããå€ããªããŸãã 48ãã¯ã»ã«ä»¥äžã®ãµã€ãºã®ç»åïŒããã¯ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã°ã©ãã£ãã¯ã¹ã®ã»ãŒ80ïŒ
ã§ãïŒã§ã¯ãç¶æ³ã¯æ¬¡ã®ããã«çž®éããŸãïŒãã¯ã¿ãŒç»åã¯1ã€ã®è§£å床ã®ã¿ã§æ£ããã©ã¹ã¿ã©ã€ãºããããã以å€ã®å Žåã«æé©åãããŸãã æºåãããééã£ããµã€ãºã§ãã¯ãã«ã¢ã€ã³ã³ã衚瀺ãããšã容赊ãªãã¢ã³ããšã€ãªã¢ã·ã³ã°ã¯ããªããåŸ
ãããŸããã
察æ
å Žåã«ãã£ãŠã¯ãç»åãµã€ãºãåçŽã«å¢ããã ãã§å¯Ÿå¿ã§ããŸãã ããšãã°ãããŒã«ããŒã®ãã¿ã³ã«ã¯32x32ãã¯ã»ã«ã®ãµã€ãºã®ç»åã䜿çšããã³ã³ããã¹ãã¡ãã¥ãŒã«ã¯25x25ã®ã¢ã€ã³ã³ã䜿çšããŸãã ãã ãããã¯ãã«ã¢ã€ã³ã³ã®ã©ã¹ã¿ã©ã€ãºæ¹æ³ãæ¬åœã«éèŠãªå Žåã¯ãç¹å®ã®è§£ååºŠã«æé©åããå¿
èŠããããŸããç»åã®å¿
èŠãªè©³çްã¯ãåºåã©ã¹ã¿ã®ãã¯ã»ã«å¢çãšäžèŽããå¿
èŠããããŸãã
5.ããã¹ããåçŽã«ç§»åãã
ããã¹ãã衚瀺ãããšããWPFã¯ããã€ãã®ã·ã£ãŒãåææ³ã䜿çšããŸãã ããã¹ãã¯éçã§ããããã®äœçœ®ãšéžæãããã©ã¹ã¿ãŒåã¢ãŒãïŒ.NET Framework 4.0以éïŒã¯å¯èœãªéãæç¢ºã«èŠããŸãã åçŽæ¹åã«ç§»åãããšãç¹å®ã®ããæå€ã§ãsharpilkaããæ¥æ¿ã«ãªãã«ãªãããã®åŸåŸã
ã«ãªã³ã«æ»ããŸãã
次ã«ãããã¹ãã¢ãã¡ãŒã·ã§ã³ãæŒããããšãã«ãã¿ã³ã«è¡šç€ºãããåœã®ãŒãã广ã®äŸã瀺ããŸãã
<Button VerticalAlignment="Top"> <Button.Template> <ControlTemplate TargetType="Button"> <Border Width="255" Height="40" BorderThickness="1 0 1 1" CornerRadius="0 0 10 10" BorderBrush="#FF202020" Background="#FFF7941D"> <StackPanel Name="Panel" Orientation="Horizontal"> <Label Content=" " Foreground="#FF202020" VerticalAlignment="Center" Margin="20 0 0 0" Padding="0"/> </StackPanel> </Border> <ControlTemplate.Triggers> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="Panel" Property="Margin" Value="3 1 -3 -1"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Button.Template> </Button>
ãã®äŸã®ãŒãå
·åã¯ããªãäžæè°ã§ãã ã©ããããäžã®å¢çç·ã®æ¬ åŠã
StackPanelã§ã®ããã¹ãã®ãã¹ãïŒå®éã®ç¶æ³ã§ã¯ãã¿ã³ã«ãç»åããããŸããïŒãããã³ããã¹ãã®1ã2ãã¯ã»ã«äžãžã®æ¥æ¿ãªã·ããã®çµã¿åãããæ©èœããŠããããã§ãã
察æ
.NET Framework 4.0以éã§ã¯ã
TextOptions屿§ã䜿çšããŠã
Idealãš
Displayã® 2ã€ã®ããã¹ãã©ã¹ã¿ã©ã€ãºã¢ãŒãããéžæã§ããŸãã ããã«ãããäžå¿«ãªãŒãã广ããããã«æžå°ããŸãã ãã¬ãŒã ã¯ãŒã¯ã®ä»¥åã®ããŒãžã§ã³ã§ã¯ãã©ã¹ã¿ã©ã€ãºã¢ãŒãã¯
çæ³ã¢ãŒãã«å¯Ÿå¿ããŠããŸããæåã¯ãã¯ã»ã«ã°ãªããã«åãŸããã©ã¹ã¿ã©ã€ãºãããŸãã
衚瀺ã¢ãŒãã§ã¯ãäžéåŠçã䜿çšãããŸããæ°Žå¹³ããã¹ãã¯åžžã«ãã¯ã»ã«ã«æç¢ºã«æ·»ä»ãããåãæåãåãããã«ã©ã¹ã¿ã©ã€ãºãããŸãã ããã¹ãåºåã¢ãŒãã®è©³çްã«ã€ããŠã¯ã
ãã¡ããš
ãã¡ããã芧ãã ãã ã
æ¥ãªããã¹ãç§»åã®ãŒãã广ã¯ãå®éšå®€ã§ç°¡åã«åçŸã§ããŸãã ãã¯ã»ã«ã®ãµã€ãºã®åæ°ã§ã¯ãªãäœçœ®ã«åçŽã«ç§»åããã ãã§ååã§ãã 以äžã¯ã3ã€ã®ããã¹ããããã¯ã®å¹³è¡ç§»åã®äŸã§ãã åãåºåã¢ãŒãã®äžã®2ã€ã®ãããã¯ã¯ãç°ãªã£ãŠãŒãããŠããŸãã éèŠãªã®ã¯ã·ããå€ã§ã¯ãªããã©ã¹ã¿ã°ãªããã«å¯Ÿããããã¹ãã®äœçœ®ã§ãã
ããã¹ããç§»åãããšããåãªãäºå®ã¯ãå¿
ããããåçãªãŒãããã«ã€ãªãããŸããã ãã®å¹æãçºçãããšãè¡å
šäœã«åœ±é¿ããŸãã æ®å¿µãªãããéçºè
ã«ã¯ãã®å¹æãå¶åŸ¡ããææ®µããããŸããã å Žåã«ãã£ãŠã¯ããã¯ã»ã«ã®å¢çã«æ²¿ã£ãŠãããã¯ã®åº§æšãæããããçµéšçã«ã·ããã®éãéžæããããšã«ããããã®çºçãåé¿ã§ããŸãã
6. SnapsToDevicePixelsããããã£ã®äœ¿çš
Rectangle ã
Ellipse ã
Line ã
Path ã
Borderãªã©ã®åºæ¬çãªèŠèŠèŠçŽ ã䜿çšããå Žåããã¯ã»ã«ãµã€ãºã®åæ°ã§ã¯ãªã座æšã§è¡šç€ºãããšãåçŽç·ãšæ°Žå¹³ç·ã®ãŒããã確å®ã«è¡šç€ºãããŸãã æå®ãããèŠçŽ ã䜿çšããŠæ§ç¯ãããç»åã®äŸã次ã«ç€ºããŸãã
<Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="10"/> <RowDefinition Height="20"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="25"/> <ColumnDefinition Width="6"/> </Grid.ColumnDefinitions> <Ellipse Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Fill="Black" Width="10" Height="10" VerticalAlignment="Top" Margin="15 5 0 0"/> <Line Grid.RowSpan="2" X1="10" X2="20" Y1="1" Y2="11" Stroke="Black"/> <Line Grid.ColumnSpan="2" Grid.RowSpan="2" X1="30" X2="20" Y1="1" Y2="11" Stroke="Black" /> <Border Grid.ColumnSpan="2" Grid.Row="1" Background="#FFF7941D"/> <Rectangle Grid.Column="0" Grid.Row="1" Fill="White" RadiusX="3" RadiusY="3" Margin="2.5"/> <Line Grid.Column="1" Grid.Row="1" StrokeThickness="1" Stroke="Black" X1="0" X2="4" Y1="3" Y2="3"/> <Line Grid.Column="1" Grid.Row="1" StrokeThickness="1" Stroke="Black" X1="0" X2="4" Y1="5" Y2="5"/> <Line Grid.Column="1" Grid.Row="1" StrokeThickness="1" Stroke="Black" X1="0" X2="4" Y1="7" Y2="7"/> </Grid>

以äžã®å³ã§ã¯ããã¢ç»åã䜿çšããã³ã³ãããŒã«ã0.2ãã¯ã»ã«ã®ã¹ãããã§ç§»åããŸãã ãŸãã圌ã¯ãããåè»žã«æ²¿ã£ãŠåå¥ã«è¡ããæ¬¡ã«ååŒ§ã«æ²¿ã£ãŠè¡ããŸãã ç§»åã®ãã§ãŒãºã«å¿ããŠãã³ã³ãããŒã«ã®ããŒã«ã«åº§æšã°ãªããã¯ãç©ççãªã©ã¹ã¿ã°ãªããã«ç°ãªã£ãŠéããããŸãã






ãã¬ãã®å€åŽã®å¢çãã¯ã£ããããŠããããšãããã°ãç»é¢ã®å¢çãã¯ã£ããããŠããããšããããŸãããåæã«èµ·ããããšã¯ãããŸããã ãã¿ã³ã¯æ°Žå¹³ãŸãã¯åçŽã®ããããã§ã¯ã£ããããŠãããå€ãã®å Žåãäž¡æ¹ã®è»žã§ãŒãããŠããŸãã ä»»æã®çµã¿åããã®ã¢ã³ããã¯å°ãæ»ããã§ããããã®ããè€éã§ã¯ãããŸããã
察æ
SnapsToDevicePixelsããããã£ã
Trueã«èšå®ããããšã«ããããã¯ã»ã«ãã€ã³ãã£ã³ã°ã®ã³ã³ãããŒã«ãæå¹ã«ã§ã
ãŸã ïŒãããè¡ãã«ã¯ãã«ãŒãã°ãªããã§ãã®å±æ§ãèšå®ããã ãã§ãïŒã çµæã¯ããå®å®ããŸãã






ãã ããç»åã¯ç§»åããŠãäžå€ã§ã¯ãªããçæ³çã«ã¯ãã¯ã»ã«ã«ã¹ããããããŸããã ãã¬ãç»é¢ã¯äž¡æ¹ã®è»žã§1ãã¯ã»ã«ä»¥å
ã§æºãããã¿ã³ã¯åžžã«ãŒãããŠããŸãã
SnapsToDevicePixelsããããã£ã
Trueã«èšå®ãããšãã¬ã³ããªã³ã°æã«èŠèŠèŠçŽ ãç»é¢ãã¯ã»ã«ã®å¢çå
ã«åãŸãããã«ãªããŸãã åã³ã³ãããŒã«ã¯ãç°ãªãç±æãšç°ãªãæ¹æ³ã§ãããè¡ãããåªããŸãã ããšãã°ã
Image ã
Labelãããã³
TextBlockã¯ããã®å±æ§ãšã¯ãŸã£ããç¡é¢ä¿ã§ãã ãœãŒã¹ãžãªã¡ããªãæåããå Žåã®ã¿ã
ã©ã€ã³ã¯ãã¯ã»ã«ã«ãããããŸãã å察ã«ã
Rectangleã¯ãºãã³ããé£ã³åºããåžžã«ãã¯ã»ã«ã«ãããããŸãã
ããå®å®ãããã¯ã»ã«ã¹ããããè¡ãã«ã¯ãå
ã®ç»åã調æŽããå¿
èŠããããŸãã
- ãã¿ã³ã衚ãç·ã®ãã¹ãŠã®Y座æšã«0.5ã远å ããŠããã¿ã³ã®ãšããžãã³ã³ãããŒã«ã¹ããŒã¹ã®ãã¯ã»ã«ã°ãªãããšäžèŽããããã«ããŸãã
- TVç»é¢ã®æŽæ°ãããšãã°2ãã€ã³ãã³ãããŠããã€ã³ãã£ã³ã°ãæãè¿ããã¯ã»ã«å¢çã«æºãããªãããã«ããŸãã






ãšããã§ããããã®ã¢ã¯ã·ã§ã³ã¯ã96 dpiã®æšæºè§£å床ã§ã®ã¿æç¢ºã§å®å®ããåºåãååŸããã®ã«åœ¹ç«ã¡ãŸãããæ®ãã¯æ··ä¹±ãšåæºãæ®ããŸãã ä»»æã®è§£å床ã§ãã¯ã»ã«ãååŸããã«ã¯ããèªå·±æç»ã³ã³ãããŒã«ãã»ã¯ã·ã§ã³ã®æšå¥šäºé
ãåç
§ããå¿
èŠããããŸãïŒã³ã³ãããŒã«ã®ãµã€ãºã¯ããã¯ã»ã«ã®ç©ççãªãµã€ãºã«åºã¥ããŠãå€åºå
ã§èª¿æŽããå¿
èŠããããŸãïŒã
7.èªå·±æç»ã³ã³ãããŒã«
èŠèŠèŠçŽ ã§
OnRenderããªãŒããŒã©ãããã
DrawingContextã䜿çšããŠèªåã§æç»ããå Žåãåã®æ¹æ³ã®
Shapeç¶æ¿è
ãšãŸã£ããåãã©ã¹ã¿åã®åé¡ããããŸããã
SnapsToDevicePixelsæ©èœãèªåã§å®è£
ããå¿
èŠããããŸãã ãã¡ãããå¿
èŠãªå Žåã ããªãã¯ãã®ãããªããšãããããšã¯ã§ããŸããïŒ
public class Washer : FrameworkElement { public Washer() { _brush = new SolidColorBrush(Color.FromRgb(247, 148, 29)); _brush.Freeze(); _pen = new Pen(Brushes.Black, 1); _pen.Freeze(); } protected override void OnRender(DrawingContext dc) {
äžãããã座æšã¯ãã¹ãп޿°ã§ãããšããäºå®ã«ãããããããå¶åŸ¡ç©ºéå
ã®ãã¯ã»ã«ã°ãªããäžã®éãåããã¯æ¬¡ã®ããã«çºçããŸãã

ãã³ã®å¹
ã¯ã座æšã§æå®ãããç·ããäž¡æ¹åã«ã«ãŠã³ããããŸãã ãã³ã®ååããã¯ã»ã«ã®å¹
ã§å®å
šã«åå²ãããŠããªãå Žåãæå®ããã座æšããã¯ã»ã«ã®å¢çã«ãŽã£ããåã£ãŠããŠããã©ã€ã³ã®ãšããžã¯ãã¯ã»ã«ã®å¢çå
ã«åãŸããŸããã ç»åãè€éãªå Žåãç»åãåããªãããšã倿ããå ŽåããããŸããããã¹ãŠã®ã³ã³ããŒãã³ããã¯ãªã¢ã§ããããšãå®çŸããããšã¯æ©èœããŸããã ãã®å³ã¯ã0.2ãã¯ã»ã«åäœã§ã®ç»åã®åãã瀺ããŠããŸãã





察æ
WPFã¯ããã¯ã»ã«ã«ã¹ãããããããã®ç¹å¥ãªããŒã«ãæäŸããŸã-
ã¬ã€ãã©ã€ã³ ã ã³ã³ãããŒã«ãã¬ã³ããªã³ã°ããããã®äžé£ã®ã¢ã¯ã·ã§ã³ã圢æããæ®µéã§ïŒããã
OnRenderã¡ãœããã®
æ©èœã§ã ïŒãã³ã³ãããŒã«ç©ºéã®åçŽããã³æ°Žå¹³åº§æšãæå®ã§ããŸããããã¯ãåºåæã«ãã¯ã»ã«ã®å¢çã«æ£ç¢ºã«ãã£ããããå¿
èŠããããŸãã
ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãïŒ
OnRenderã¡ãœãã
ã®ã¿ ïŒïŒ
protected override void OnRender(DrawingContext dc) { double halfPen = _pen.Thickness / 2;

ã¬ã€ãã䜿çšããã«ã¯ãçŸåšã®åºåè§£å床ãç¥ãå¿
èŠã¯ãããŸããã ã³ã³ãããŒã«ã®ããŒã«ã«åº§æšã«é©åã«é
眮ããã ãã§ååã§ãã äžèšã®äŸã¯ã96 dpiã®æšæºè§£å床ã§ã®ã¿æ£ããæ©èœããŸãã96dpiã§ã¯ããã³ã®å¹
ããã¯ã»ã«ãµã€ãºãšäžèŽããŸãã ä»ã®è§£ååºŠã§æç¢ºãªå¢çç·ãå®çŸããã«ã¯ãååŽé¢ã«ã¬ã€ããå²ãåœãŠãå¿
èŠããããŸãã





éèŠãªãã¥ã¢ã³ã¹ã¯ãã¬ã€ããã¹ã¿ãã¯ãä»ããŠ
DrawingContextãšå¯Ÿè©±ãããšåæã«ãã¬ã€ããå«ãŸããã·ã§ã€ãã ãã§ãªããçŸåšã®åºåå
šäœã«åœ±é¿ãäžããããšã§ãã ãã®ããããã®äŸã§ã¯ã2æ¬ã®å¹³è¡ç·ãæããããã«ãå軞ã«1ã€ã®ã¬ã€ãã®ã¿ã䜿çšãããŠããŸãã 䜿çšãããŠãããã¹ãŠã®ã¬ã€ããåéããããããäžåºŠã«ã¹ã¿ãã¯ã«ããã·ã¥ãããšãçµæã¯æ²æšãªãã®ã«ãªããŸãã ç«¶åã®ããããããã®äžéšã®ã¿ãæ©èœããæ®ãã¯ç¡èŠãããŸãã
ã¬ã€ãã«æ²¿ã£ããã¯ã»ã«å¢çãžã®äœçœ®åããã¯äž¡æ¹åã§å®è¡ããããããç°ãªãç¶æ³ã§ã¯ãç»åã®ç°ãªãéšåãç°ãªãæ¹åã«ç§»åã§ããŸãã åçãåãããšãæŽæ¿¯æ©ã®éšåãäºãã«çžå¯Ÿçã«å·»ãåãããç¶æ³ã«ãã£ãŠã¯åœŒå¥³ã®è¶³ãæ¶ããŸãã åã®ã»ã¯ã·ã§ã³ã§è¡ã£ãããã«ãç¹å®ã®è§£å床ã§å®å®ããåºåãæé©åããããšã§ç»åã倿Žã§ããŸãããã©ã®è§£å床ã§ãå®å®ããåºåãéæããããšã¯ã§ããŸããã 以äžã§ã¯ããã®æ¬ ç¹ããªãããã¯ã»ã«ã«ã¹ãããããå¥ã®æ¹æ³ãæ€èšããŸãã
代æ¿ã®åäœçš
ã³ã³ãããŒã«ãèªåã§æç»ãããšãã«ãã¬ã€ãã䜿çšããŠãã¯ã»ã«ã«ã¹ãããããå¿
èŠã¯ãããŸããã ãµã€ã¯ãªã³ã°æå¥œå®¶ã¯ãã¬ã³ããªã³ã°ãããããªããã£ããæåã§èª¿æŽããããšã«ããããã¯ã»ã«ã®å¢çå
ã«å
¥ãããšãã§ããŸãã èŠãç®ã»ã©é£ãããããŸããã
æ¬¡ã®æ¡ä»¶ãå¿
èŠã§ãã- ãœãŒã¹ããŒã¿ã®åº§æšã¯ããã¯ã»ã«ã®å¢çå
ã«åãŸãå¿
èŠããããŸãã96 dpiã®å ŽåãMath.Roundã䜿çšã§ããŸããäžè¬çãªå Žåãç¹å®ã®ãã¯ã»ã«ãµã€ãºã«äžžããå¿
èŠããããŸãã
- 䜿çšããã矜ã®å¹
ã¯ããã¯ã»ã«ãµã€ãºã®åæ°ã§ãªããã°ãªããŸããã
- ãã³ã®å¹
ã«å¥æ°ã®ãã¯ã»ã«ãå«ãŸããå Žåã衚瀺ãããããªããã£ãã®åº§æšã¯ãã¯ã»ã«å¹
ã®ååã ãã·ããããå¿
èŠããããŸãã
- ã³ã³ãããŒã«ã衚瀺ãããšãã¯ãã©ã¹ã¿ã°ãªããã«å¯Ÿãã座æšã®ã·ãããä¿®æ£ãããã®åãã®ããããã§OnRenderãåèµ·åããå¿
èŠããããŸãã
æåã®2ã€ã®ãã€ã³ãã¯ããã®ãããªéçã¯ã©ã¹ã䜿çšããŠå®è£
ã§ããŸãïŒãã®ãã©ã°ã¡ã³ãã¯æåã®2ã€ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸããïŒã
å€ïŒããšãã°ããã³ã®å¹
ãç»é¢åº§æšïŒããã¯ã»ã«ãµã€ãºã«ãã£ãããšé¢é£ä»ããå¿
èŠãããå Žåã¯ãRender.PixelSize * nãšããŠèšå®ããã ãã§ãããã¯ã»ã«ãµã€ãºã®åæ°ã«äžžããå¿
èŠãããå Žåã¯ãRender.SnapToPixelsã¡ãœããã䜿çšããå¿
èŠããããŸããç¬ç«ããŠæç»ãããã³ã³ãããŒã«ã®åºæ¬ã¯ã©ã¹ãšããŠã3çªç®ãš4çªç®ã®æ¡ä»¶ïŒã³ã³ãããŒã«ã®ãµããã¯ã»ã«ã·ãããšãã§ã¶ãŒã®å¥æ°ãµã€ãºã®è£æ£ïŒãå®è£
ãããšäŸ¿å©ã§ãã public class SelfDrawingControlBase : FrameworkElement { public SelfDrawingControlBase() { Snap = 0.5 * Render.PixelSize; SubpixelOffset = new Point(0, 0); LayoutUpdated += OnLayoutUpdated; } protected void OnLayoutUpdated(object sender, EventArgs e) { FixSubpixelOffset(); InvalidateVisual(); }
ãã®ã¯ã©ã¹ã®äž»ãªæ©èœã¯ã衚瀺ããåã«ã°ã©ãã£ãã¯ããªããã£ãã®åº§æšãä¿®æ£ããããšã§ããSnapXXXã¡ãœããã¯ãã¬ã³ããªã³ã°çµæããã¯ã»ã«ã®å¢çå
ã«æ£ç¢ºã«åãŸãããã«ãå
ã®ããŒã¿ã倿ŽããŸããé·æ¹åœ¢ãšæ¥åã¯ãå¹
ã奿°ã®çŸœã§å®å
šã«åãã¯ã»ã«ã·ããããã®ã«ååã§ããæ°Žå¹³ç·ã®å ŽåãY座æšã調æŽããå¿
èŠããããåçŽç·ã®å Žåã¯X座æšã«è§Šããªãã§ãã ãã-éãåæ§ã§ãã座æšè£æ£äžã«ããã¯ã»ã«ã°ãªããã«å¯Ÿããã³ã³ãããŒã«ã®ã·ãããèæ
®ãããŸããäŸã®æŽæ¿¯æ©ã§ãã¯ã»ã«ã«ã¹ãããããïŒ public class Washer : SelfDrawingControlBase { public Washer() { _brush = new SolidColorBrush(Color.FromRgb(247, 148, 29)); _brush.Freeze(); _pen = new Pen(Brushes.Black, 1); _pen.Freeze(); } protected override void OnRender(DrawingContext dc) {
çµæã¯ã¬ã€ãã§ãåæ§ã®æ¹æ³ã§åŸãããŸãããåæã«ã³ã³ãããŒã«ã®åãã«å¯ŸããŠå®å®ããŠããŸããããã¯ã座æšã®ä¿®æ£ãäžæ¹åã§ã®ã¿å®è¡ããããšããäºå®ã«ãããã®ã§ãã



äŸã®ç¹å®ã®ãœãªã¥ãŒã·ã§ã³ã¯ã96 dpiã®æšæºè§£å床ã§ã®ã¿æ©èœããŸã-ãã³ãµã€ãºãšããªããã£ãã®åº§æšã¯ãæç¢ºã«ããããã«ç¹å®ã®çªå·ã§ã³ãŒãã«æ¿å
¥ãããŸããç»åãä»»æã®è§£å床ã®ãã¯ã»ã«ã«æ£ããã¹ãããããå¿
èŠãããå ŽåãããŒã¿ãSnapXXXã¡ãœããã«è»¢éããåã«ãRender.SnapToPixelsã¡ãœããã䜿çšããŠãã¯ã»ã«å¢çã«äžžããå¿
èŠããããŸããããšãã°ãã³ã³ãããŒã«ã¯ãè§£å床ã倿Žãããšãã«é©åã«æ¡å€§çž®å°ãããã¯ã»ã«ã®å¢çã«åãŸãé·æ¹åœ¢ãæç»ããŸãã public class CrossDpiBrick : SelfDrawingControlBase { public CrossDpiBrick() { _brush = new SolidColorBrush(Color.FromRgb(247, 148, 29)); _brush.Freeze(); _pen = new Pen(Brushes.Black, Render.SnapToPixels(7)); _pen.Freeze(); } protected override void OnRender(DrawingContext dc) { var rect = new Rect(Render.SnapToPixels(10), Render.SnapToPixels(10), Render.SnapToPixels(120), Render.SnapToPixels(40)); SnapRectangle(_pen, ref rect); dc.DrawRoundedRectangle(_brush, _pen, rect, Render.SnapToPixels(10), Render.SnapToPixels(10)); } private Pen _pen; private Brush _brush; }
ãã¯ã»ã«ãžã®æåã¹ãããã§ã¯ãçµã¿èŸŒã¿ã®WPFããŒã«ã䜿çšããå Žåãããã¬ã³ããªã³ã°ããã»ã¹ã«å°ãä»å
¥ãå¿
èŠã§ããããã®ããã»ã¹ãããæè»ã«å¶åŸ¡ããä»»æã®åºåè§£å床ã§å®å®ããåºåãå®çŸã§ããŸãããããã«
WPFã¯ãç»é¢ãã¯ã»ã«ãžã®ãã€ã³ãã«å¿
èŠãªãã¹ãŠã®ããŒã«ãéçºè
ã«æäŸããŸããæšæºã®ã³ã³ãããŒã«ã©ã€ãã©ãªã§ã¯ããããã®ããŒã«ãããã©ã«ãã§äœ¿çšãããŸããã»ãšãã©ã®å Žåããµããã¯ã»ã«ã·ãããæ°ã«ããããšã¯ã§ããŸããããã ãããã¯ã¿ãŒã°ã©ãã£ãã¯ã¹ãšã©ã¹ã¿ãŒã°ã©ãã£ãã¯ã¹ãæäœãããšããããã³ã³ã³ãããŒã«ãç¬ç«ããŠæç»ãããšããæç¢ºãªçµè«ãéæããããã«ãéçºè
ã¯ãã¯ã»ã«ãã€ã³ãã®ææ®µãæç€ºçã«äœ¿çšããå¿
èŠããããŸãããã®ããã«ã¯ããŸããã©ã¹ã¿åã®æ°ããªåé¡ã«æ³šæããå¿
èŠããããŸããããã»ã©åçŽã§ã¯ãããŸããããã€ã¯ããœãã補åã§ãããå¿
ãããå®ç§ãªç»åãèªã£ãŠããŸãããããšãã°ãMicrosoft Word 2010ã®çµ±åãã¯ãã«ã°ã©ãã£ãã¯ãšãã£ã¿ãŒã®èŠçŽ ã¯æ¬¡ã®ãšããã§ããããªãã¿ã®ã¢ãŒãã£ãã¡ã¯ãïŒãã®ãããªæ€åºãããåé¡ã®é€å»ãæè¡çãªåé¡ã§ããå Žåããã®ã¬ã€ãã®ç®çã¯éæãããŠããŸãããæž
èŽããããšãããããŸããïŒ
åç
§è³æ
MSDN-WPFã¢ããªã±ãŒã·ã§ã³ã§ã®ãã¯ã»ã«ã¹ãããã·ã§ããMSDN-UIElement.UseLayoutRoundingããããã£Pete Brown- ãã©ã³ããšããã¹ãã¬ã³ããªã³ã°ãªãã·ã§ã³ã®éžæWiselyMSDNããã°-WPF 4.0ããã¹ãã¹ã¿ãã¯ã®æ¹åMSDN-æ¹æ³ïŒå³é¢ãžã®GuidelineSetã®é©çšMSDN-UIElement.SnapsToDevicePixelsããããã£Originalãã¢ã³ãŒãïŒããŠã³ããŒãïŒ104 KbïŒã€ã©ã¹ããããããšãïŒ
romson
melkopuz
sevendot