2012-01-04 37 views
42

Tôi cần một cái gì đó như thế này cho các kiểu dáng trong XAML:XAML có chỉ thị trình biên dịch có điều kiện cho chế độ gỡ lỗi không?

<Application.Resources> 

#if DEBUG 

    <Style TargetType="{x:Type ToolTip}"> 
     <Setter Property="FontFamily" Value="Arial"/> 
     <Setter Property="FlowDirection" Value="LeftToRight"/> 
    </Style> 
#else 
    <Style TargetType="{x:Type ToolTip}"> 
     <Setter Property="FontFamily" Value="Tahoma"/> 
     <Setter Property="FlowDirection" Value="RightToLeft"/> 
    </Style> 
#endif 

</Application.Resources> 
+2

Bạn đang cố gắng làm gì? – tsells

+1

Tôi cần phải có các kiểu khác nhau trong chế độ gỡ lỗi, để tôi có thể thực hiện thực thi nhẹ hơn trong chế độ gỡ lỗi. –

Trả lời

83

Gần đây tôi đã phải làm điều này và ngạc nhiên khi thấy nó đơn giản như thế nào khi tôi không thể dễ dàng tìm thấy bất kỳ ví dụ rõ ràng nào. Những gì tôi đã làm là thêm dòng sau vào AssemblyInfo.cs:

#if DEBUG 
[assembly: XmlnsDefinition("debug-mode", "Namespace")] 
#endif 

Sau đó, sử dụng thẻ AlternateContent không gian tên đánh dấu-tương thích để chọn nội dung của bạn dựa trên presense đó định nghĩa namespace:

<Window x:Class="Namespace.Class" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="debug-mode" 

     Width="400" Height="400"> 

     ... 

     <mc:AlternateContent> 
      <mc:Choice Requires="d"> 
       <Style TargetType="{x:Type ToolTip}"> 
        <Setter Property="FontFamily" Value="Arial"/> 
        <Setter Property="FlowDirection" Value="LeftToRight"/> 
       </Style> 
      </mc:Choice> 
      <mc:Fallback> 
       <Style TargetType="{x:Type ToolTip}"> 
        <Setter Property="FontFamily" Value="Tahoma"/> 
        <Setter Property="FlowDirection" Value="RightToLeft"/> 
       </Style> 
      </mc:Fallback> 
     </mc:AlternateContent> 

     ... 
</Window> 

Bây giờ , khi DEBUG được xác định, "chế độ gỡ lỗi" cũng sẽ được xác định và không gian tên "d" sẽ xuất hiện. Điều này làm cho thẻ AlternateContent chọn khối mã đầu tiên. Nếu không xác định DEBUG, thì mã khối dự phòng sẽ được sử dụng.

Mã mẫu này không được kiểm tra, nhưng về cơ bản nó giống như tôi đang sử dụng trong dự án hiện tại của tôi để hiển thị một số nút gỡ lỗi có điều kiện.

Tôi đã xem bài đăng trên blog với một số mã ví dụ dựa trên thẻ "Có thể bỏ qua", nhưng dường như ít rõ ràng và dễ sử dụng hơn như phương pháp này.

+0

Điều này thực sự thú vị và dễ dàng. Và các tài nguyên baml của RELEASE build thực sự không chứa bất kỳ đồ tạo tác nào của tất cả điều này. Tôi làm giàu một số ToolTip-StackPanels với thông tin DEBUG bổ sung theo cách này. – springy76

+4

Ngăn lỗi VS không thích điều này, mặc dù mọi thứ đều hoạt động như mong đợi: [link] (http://stackoverflow.com/questions/24459716/alternatecontent-tags-causing-issues-with-ide-but-not-compiler) – springy76

+0

Hoàn hảo ... rất đơn giản – electricalbah

2

Điều này là không thể trong WPF/Silverlight/WP7.

Trên một lưu ý thú vị, tài liệu tiêu chuẩn, ISO/IEC 29500, bao gồm cách này cần được xử lý trong một tài liệu XML, và XAML không hỗ trợ một trong các mục từ thông số này mc:Ignorable cho phép chúng ta làm những việc như thế này:

<Page xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:c="Comments" 
     mc:Ignorable="c"> 
    <Button Content="Some Text" 
      c:Content="Some other text" /> 
</Page> 

để nhận xét các thuộc tính. Tôi nghĩ rằng nó sẽ được mát mẻ nếu XAML một ngày hỗ trợ phần còn lại của spec cho phép tải nội dung thay thế.

Thuộc tính mc:Ignorable được sử dụng bởi Blend để hỗ trợ chức năng thời gian thiết kế.

+0

Thông số định dạng tệp tin XML OFFice Open XML phải làm gì với XAML? –

+0

Xe tăng, nhưng liều vấn đề này không phù hợp với tình hình của tôi. –

+0

Nicholas, nhóm phân tích cú pháp XAML (SL4, WP7.1, WPF) đã chọn sử dụng thông số đó để giải quyết nhu cầu của họ về bỏ qua các thuộc tính, thay vì chỉ làm một cái gì đó. Đó là lý do tại sao một số trang XAML mặc định có không gian tên 'mc' được định nghĩa. – JasonRShaver

Các vấn đề liên quan