1. 程式人生 > >XAML 很少人知道的科技 - walterlv

XAML 很少人知道的科技 - walterlv

lse mailto num 鍵盤 toc too hub 位或 aml

原文:XAML 很少人知道的科技 - walterlv

XAML 很少人知道的科技

本文介紹不那麽常見的 XAML 相關的知識。


本文內容
  • Thickness 可以用空格分隔
  • 使用逗號(,)設置多值枚舉
  • 使用加號(+)設置多值枚舉
  • 設置 Url 型的 XAML 命名空間(xmlns)
  • 設置默認的 XAML 命名空間前綴
  • 讓你做的控件庫不需要 XAML 命名空間前綴

Thickness 可以用空格分隔

當你用設計器修改元素的 Margin 時,你會看到用逗號分隔的 Thickness 屬性。使用設計器或者屬性面板時,使用逗號是默認的行為。

不過你有試過,使用空格分隔嗎?

<Button Margin="10 12 0 0" />

使用逗號(,)設置多值枚舉

有一些枚舉標記了 [Flags]

特性,這樣的枚舉可以通過位運算設置多個值。

[Flags]
enum NonClientFrameEdges
{
    // 省略枚舉內的值。
}

那麽在 XAML 裏面如何設置多個枚舉值呢?使用逗號(,)即可,如下面的例子:

<WindowChrome NonClientFrameEdges="Left,Bottom,Right" GlassFrameThickness="0 64 0 0" UseAeroCaptionButtons="False" />

使用加號(+)設置多值枚舉

使用逗號(,) 設置多值枚舉是通用的寫法,但是在 WPF/UWP 中設置按鍵/鍵盤快捷鍵的時候又有加號(+

)的寫法。如下面的例子:

<KeyBinding Command="{x:Static WalterlvCommands.Foo}" Modifiers="Control+Shift" Key="W" />

這裏的 Modifiers 屬性的類型是 ModifierKeys,實際上是因為這個類型特殊地編寫了一個 TypeConverter 來轉換字符串,所以鍵盤快捷鍵多值枚舉使用的位或運算用的是加號(+)。

設置 Url 型的 XAML 命名空間(xmlns)

WPF/UWP 中原生控件的 XAML 命名空間是 http://schemas.microsoft.com/winfx/2006/xaml/presentation,與 XAML 編譯器相關的 XAML 命名空間是 http://schemas.microsoft.com/winfx/2006/xaml,還有其他 Url 形式的 XAML 命名空間。

只需要在庫中寫如下特性(Attribute)即可將命名空間指定為一個 url:

using System.Windows.Markup;
[assembly: XmlnsDefinition("http://walterlv.github.io/demo", "Walterlv.NewCsprojDemo")]

詳情請閱讀博客:

  • 讓你編寫的控件庫在 XAML 中有一個統一的漂亮的命名空間(xmlns)和命名空間前綴

此寫法要生效,定義的組件與使用的組件不能在同一程序集。

設置默認的 XAML 命名空間前綴

WPF/UWP XAML 編譯器的命名空間前綴是 x。如果你寫了自己的控件,希望給控件指定一個默認的命名空間前綴,那麽可以通過在庫中寫如下特性(Attribute)實現:

using System.Windows.Markup;
[assembly: XmlnsPrefix("http://walterlv.github.io/demo", "w")]

這樣,當 XAML 設計器幫助你自動添加命名空間時,將會使用 w 前綴。雖然實際上你也能隨便改。

詳情請閱讀博客:

  • 讓你編寫的控件庫在 XAML 中有一個統一的漂亮的命名空間(xmlns)和命名空間前綴

此寫法要生效,定義的組件與使用的組件不能在同一程序集。

讓你做的控件庫不需要 XAML 命名空間前綴

自己寫了一個 DemoPage,要在 XAML 中使用,一般需要添加命名空間前綴才可以。但是也可以不寫:

<UserControl
    x:Class="HuyaHearhira.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <DemoPage />
    </Grid>
</UserControl>

方法是在庫中定義命名空間前綴為 http://schemas.microsoft.com/winfx/2006/xaml/presentation。

using System.Windows.Markup;
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Walterlv.NewCsprojDemo")]

此寫法要生效,定義的組件與使用的組件不能在同一程序集。

本文會經常更新,請閱讀原文: https://blog.walterlv.com/post/those-people-dont-know-about-xaml.html ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。

如果你想持續閱讀我的最新博客,請點擊 RSS 訂閱,或者前往 CSDN 關註我的主頁。

技術分享圖片 本作品采用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名 呂毅 (包含鏈接: https://blog.walterlv.com ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請 與我聯系 ([email protected]) 。

技術分享圖片
站長統計 | 今日IP[55] | 今日PV[101] | 昨日IP[288] | 昨日PV[513] | 當前在線[1]

? 2014-2019 walterlv, all rights reserved. Powered by: Jekyll Theme by: walterlv Based on Thiago Rossener

XAML 很少人知道的科技 - walterlv