在C# XAML中,x:Type 是一個標記擴展,用於在XAML中引用CLR類型。下面詳細解釋它的含義和用法:

含義

x:Type 相當於C#中的 typeof() 操作符,它返回指定類型的 System.Type 對象。

基本語法

xaml

{x:Type TypeName}

主要用法

1. 設置樣式和模板的 TargetType

xaml

<!-- 為特定類型創建樣式 -->
<Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Blue"/>
    <Setter Property="Foreground" Value="White"/>
</Style>

<!-- 為自定義類型創建樣式 -->
<Style TargetType="{x:Type local:MyCustomControl}">
    <Setter Property="MyProperty" Value="SomeValue"/>
</Style>

2. 在 DataTemplate 中指定數據類型

xaml

<!-- 指定DataTemplate適用的數據類型 -->
<DataTemplate DataType="{x:Type local:Person}">
    <StackPanel>
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding Age}"/>
    </StackPanel>
</DataTemplate>

3. 在資源字典中作為鍵使用

xaml

<ResourceDictionary>
    <!-- 使用類型作為資源鍵 -->
    <SolidColorBrush x:Key="{x:Type Button}" Color="Red"/>
    
    <!-- 為自定義類型定義模板 -->
    <ControlTemplate x:Key="{x:Type local:MyControl}" TargetType="{x:Type local:MyControl}">
        <!-- 模板內容 -->
    </ControlTemplate>
</ResourceDictionary>

4. 在觸發器中使用

xaml

<Style TargetType="{x:Type ListBoxItem}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding}" Value="{x:Null}">
            <Setter Property="Background" Value="LightGray"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

5. 與 x:TypeArguments 配合使用(泛型)

xaml

<!-- 創建泛型類型的實例 -->
<local:GenericCollection x:TypeArguments="{x:Type local:Person}">
    <!-- 集合內容 -->
</local:GenericCollection>

實際示例

示例1:完整的樣式定義

xaml

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyApp">
    
    <Window.Resources>
        <!-- 為TextBox定義樣式 -->
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="FontSize" Value="14"/>
            <Setter Property="Margin" Value="5"/>
            <Setter Property="Padding" Value="3"/>
        </Style>
        
        <!-- 為自定義類定義DataTemplate -->
        <DataTemplate DataType="{x:Type local:Product}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
                <TextBlock Text="{Binding Price}" Margin="10,0,0,0"/>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    
    <StackPanel>
        <TextBox Text="這是一個樣式化的文本框"/>
        <ListBox ItemsSource="{Binding Products}"/>
    </StackPanel>
</Window>

示例2:對應的C#代碼

csharp

// 對應的C#類
namespace MyApp
{
    public class Product
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
    
    public partial class MainWindow : Window
    {
        public ObservableCollection<Product> Products { get; set; }
        
        public MainWindow()
        {
            InitializeComponent();
            Products = new ObservableCollection<Product>
            {
                new Product { Name = "產品A", Price = 100 },
                new Product { Name = "產品B", Price = 200 }
            };
            DataContext = this;
        }
    }
}

注意事項

  1. 命名空間引用:使用自定義類型時,確保已通過 xmlns 正確引用命名空間
  2. 類型可見性:引用的類型必須是public的,否則XAML解析器無法訪問
  3. 性能考慮:過度使用 x:Type 可能會影響XAML解析性能

與 typeof() 的對應關係

csharp

// C# 代碼中的等效寫法
Type buttonType = typeof(Button);
Style buttonStyle = new Style(typeof(Button));

// XAML 中的等效寫法
<Style TargetType="{x:Type Button}">

x:Type 是XAML中類型系統的重要組成部分,它使得在聲明式標記中能夠強類型地引用CLR類型,提高了代碼的類型安全性和可維護性。