programing

XAML에는 디버그 모드에 대한 조건부 컴파일러 지시문이 있습니까?

jooyons 2023. 6. 4. 10:30
반응형

XAML에는 디버그 모드에 대한 조건부 컴파일러 지시문이 있습니까?

나는 XAML의 스타일을 위해 다음과 같은 것이 필요합니다:

<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>

저는 최근에 이것을 해야만 했고, 명확한 예를 쉽게 찾을 수 없을 때 그것이 얼마나 간단한지에 놀랐습니다.제가 한 일은 AssemblyInfo.cs 에 다음을 추가한 것입니다.

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

그런 다음 마크업 호환 네임스페이스의 AlternateContent 태그를 사용하여 해당 네임스페이스 정의의 존재에 따라 콘텐츠를 선택합니다.

<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>

이제 DEBUG가 정의되면 "debug-mode"도 정의되고 "d" 네임스페이스가 존재합니다.그러면 대체 내용 태그가 첫 번째 코드 블록을 선택합니다.DEBUG가 정의되지 않은 경우 코드의 폴백 블록이 사용됩니다.

이 샘플 코드는 테스트되지 않았지만 일부 디버그 단추를 조건부로 표시하기 위해 현재 프로젝트에서 사용하는 것과 기본적으로 동일합니다.

저는 "무시할 수 있는" 태그에 의존하는 몇 가지 예제 코드가 있는 블로그 게시물을 보았지만, 그것은 훨씬 덜 명확하고 이 방법으로 사용하기 쉬운 것처럼 보였습니다.

WPF/Silverlight/WP7에서는 이 작업이 불가능합니다.

흥미롭게도, 표준 문서인 ISO/IEC 29500(Office Open XML File Formats)은 XML 문서에서 이를 처리하는 방법을 다루며, XAML은 해당 규격의 항목 중 하나를 지원합니다.mc:Ignorable이를 통해 다음과 같은 작업을 수행할 수 있습니다.

<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>

특성을 주석 처리합니다.

XAML 파서 팀(SL4, WP7.1, WPF)은 단순히 무언가를 만드는 것이 아니라 속성을 무시하는 요구를 해결하기 위해 이 사양을 사용하기로 결정했습니다.이 때문에 일부 기본 XAML 페이지에는 'mc' 네임스페이스가 정의되어 있습니다.언젠가 XAML이 대체 콘텐츠 로드를 허용하는 나머지 사양을 지원한다면 멋질 것 같습니다.

mc:Ignorable특성은 설계 시간 기능을 지원하기 위해 혼합에서 사용됩니다.

템플릿 선택기를 사용할 수 있습니다.DataTemplateSelector 클래스는 코드화한 것입니다.재정의하는 템플릿 선택 방법을 사용하여 전처리기 지시사항을 넣을 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx

저는 이것들 중 어느 것에도 만족하지 못했고 이것을 했습니다.

내 XAML에는 .cs 파일에서 스크루하고 있다는 것을 알 수 있도록 공간이 있는 속성이나 태그를 넣었습니다.

<Window x:Class="...
    mc:Ignorable="d"
    Title="" 
    BorderThickness="2"
    WindowStartupLocation="CenterScreen"
    ResizeMode="NoResize"
    Height="200" 
    Width="500"
    
    WindowStyle="None"    
    >

내 코드 뒤에 있는 내 코드에서 나는 이렇게 합니다.

    public partial class ScanProgressWindow : Window
    {
        public ScanProgressWindow()
        {
            InitializeComponent();
 #if DEBUG
            this.WindowStyle = WindowStyle.SingleBorderWindow;
 #endif
        }
    }

나한테 효과가 있어요.

저는 주어진 답들이 가장 사용하기 쉽다고 생각하지 않습니다.사용자 지정 연결 가능 종속성 속성을 사용하는 솔루션은 다음과 같습니다.

using namespace Utility{
    public static class DebugVisibility
    {
        public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.RegisterAttached(
    "Debug", typeof(bool?), typeof(DebugVisibility), new PropertyMetadata(default(bool?), IsVisibleChangedCallback));

        private static void IsVisibleChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var fe = d as FrameworkElement;
            if (fe == null)
                return;
#if DEBUG
            fe.Visibility = Visibility.Visible;
#else
            fe.Visibility = Visibility.Collapsed;
#endif
        }

        public static void SetIsVisible(DependencyObject element, bool? value)
        {
            element.SetValue(IsVisibleProperty, value);
        }

        public static bool? GetIsVisible(DependencyObject element)
        {
            return (bool?)element.GetValue(IsVisibleProperty);
        }
    }
}

그리고 xaml은 다음과 같이 사용됩니다.

<window ... xmlns:Util="clr-namespace:MyNamespace.Utility" >
    <Label Util:DebugVisibility.IsVisible="True">
</window>

당신이 다른 가시성 논리를 추가할 경우를 대비해 제가 보관했습니다.이것은 모든 컨트롤에 바인딩 및 부착할 수 있는 간단한 토글입니다.

언급URL : https://stackoverflow.com/questions/8732307/does-xaml-have-a-conditional-compiler-directive-for-debug-mode

반응형