source

WPF 및 XAML의 숨겨진 기능?

factcode 2023. 5. 29. 11:12
반응형

WPF 및 XAML의 숨겨진 기능?

다음은 다양한 언어에 대해 논의된 수많은 숨겨진 기능입니다.지금 저는 XAML과 WPF의 숨겨진 특징이 궁금합니다.

하나는 ListView의 헤더 클릭 이벤트입니다.

<ListView x:Name='lv' 
      Height="150" 
      GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">

그리드 보기 열 머리글입니다.클릭 속성이 나열되지 않습니다.

지금까지 관련 기능 중 일부는 다음과 같습니다.

참고 항목:

  1. C#의 숨겨진 특징
  2. Python의 숨겨진 기능
  3. ASP.NET의 숨겨진 기능
  4. Perl의 숨겨진 기능
  5. Java의 숨겨진 기능
  6. VB.NET의 숨겨진 기능
  7. PHP의 숨겨진 기능
  8. 루비의 숨겨진 특징
  9. C의 숨겨진 특징
  10. 기타 등등......

다중 바인딩(StringFormat과 결합):

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0}, {1}">
      <Binding Path="LastName" />
      <Binding Path="FirstName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

프레젠테이션 추적 소스도 있습니다.특정 시나리오에서 바인딩과 관련하여 진행 중인 작업을 디버깅하는 TraceLevel 트릭입니다.시스템을 참조하기만 하면 됩니다.윈도우즈Base 어셈블리의 진단 네임스페이스

xmlns:sd="clr-namespace:System.Diagnostics;assembly=WindowsBase"

그런 다음 바인딩 식에 다음을 추가합니다.

<TextBlock Text="{Binding Message, sd:PresentationTraceSources.TraceLevel=High}"  />

로그는 다음과 같습니다.

System.Windows.Data Warning: 52 : Created BindingExpression (hash=5923895) for Binding (hash=7588182)
System.Windows.Data Warning: 54 :   Path: 'Message'
System.Windows.Data Warning: 56 : BindingExpression (hash=5923895): Default mode resolved to OneWay
System.Windows.Data Warning: 57 : BindingExpression (hash=5923895): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 58 : BindingExpression (hash=5923895): Attach to System.Windows.Controls.TextBlock.Text (hash=65248697)
System.Windows.Data Warning: 63 : BindingExpression (hash=5923895): Resolving source 

3.5sp1은 바인딩에 TargetNullValue를 도입했습니다.값을 입력하면 바인딩된 속성이 Null로 설정되고 속성이 Null이면 이 값이 표시됩니다.

<TextBox Text="{Binding Total, TargetNullValue=$0.00}" />

3.5sp1은 바인딩 식에 StringFormat을 도입하였다.

<TextBox Text="{Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}" />

레이블에 표시하기에는 너무 긴 문자열을 얻을 수도 있습니다.이 경우 우리는 다음의 재산을 이용할 수 있습니다.TextBlock엘리프스에게 보여주기 위해

<TextBlock 
  Name="sampleTextBlock" 
  TextTrimming="WordEllipsis" 
  TextWrapping="NoWrap"/>

MSDN 링크

창에 에어로 효과 추가

  <Window.Resources>
    <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, 
        PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
</Window.Resources>

x:TypeArguments를 사용하는 XAML의 일반 기능

XAML에서 관찰 가능한 컬렉션을 사용하려면 XAML에서 선언할 수 없으므로 관찰 가능한 컬렉션에서 파생된 유형을 만들어야 합니다.XAML 2009에서는 x:TypeArguments 특성을 사용하여 일반 유형의 유형을 정의할 수 있습니다.

<!-- XAML 2006 -->
class EmployeeCollection : ObservableCollection<Employee>
{
}

<l:EmployeeCollection>
    <l:Employee FirstName="John" Name="Doe" />
    <l:Employee FirstName="Tim" Name="Smith" />
</lEmployeeCollection>

<!-- XAML 2009 -->
<ObservableCollection x:TypeArguments="Employee">
    <l:Employee FirstName="John" Name="Doe" />
    <l:Employee FirstName="Tim" Name="Smith" />
</ObservableCollection />

비활성화된 컨트롤에 도구 설명 표시

Wpf를 사용하면 컨트롤이 비활성화된 상태인 경우 컨트롤에 도구 설명을 표시할 수 있습니다.

예를들면

<Button Content="Disabled Button" ToolTipService.ShowOnDisabled="True" IsEnabled="False" ToolTip="This is a disabled button"/> 

x:인수와 함께 기본값이 아닌 생성자 사용

XAML 2006에서 개체를 사용하려면 개체에 공용 기본 생성자가 있어야 합니다.XAML 2009에서는 x:Arguments 구문을 사용하여 생성자 인수를 전달할 수 있습니다.

<!-- XAML 2006 -->
<DateTime>00:00:00.0000100</DateTime>

<!-- XAML 2009 -->
<DateTime>
    <x:Arguments>
        <x:Int64>100</x:Int64>
    </x:Arguments>
</DateTime>

실제로 숨겨진 기능은 아니지만 WPF/XAML을 사용하면 Bea Stollnitz와 Josh Smith를 얻을 수 있습니다.WPF/XAML 프로그래밍의 여왕과 왕.

마크업 확장 및 첨부 속성은 제가 가장 좋아하는 기능이며, XAML "단어"를 매우 우아한 방식으로 확장할 수 있습니다.

마크업 확장

<!-- Binding to app settings -->
<CheckBox IsChecked="{my:SettingBinding MinimizeToTray}">Close to tray</CheckBox>

<!-- Fill ItemsControl with the values of an enum -->
<ComboBox ItemsSource="{my:EnumValues sys:DaysOfWeek}"/>

<!-- Localization -->
<TextBlock Text="{my:Localize HelloWorld.Text}"/>

<!-- Switch on the result of a binding -->
<TextBlock Text="{my:Switch Path=IsGood, ValueIfTrue=Good, ValueIfFalse=Bad}"/>

첨부된 속성

<!-- Sort GridView automatically -->
<ListView ItemsSource="{Binding Persons}"
      IsSynchronizedWithCurrentItem="True"
      util:GridViewSort.AutoSort="True">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Name"
                                DisplayMemberBinding="{Binding Name}"
                                util:GridViewSort.PropertyName="Name"/>
                <GridViewColumn Header="First name"
                                DisplayMemberBinding="{Binding FirstName}"
                                util:GridViewSort.PropertyName="FirstName"/>
                <GridViewColumn Header="Date of birth"
                                DisplayMemberBinding="{Binding DateOfBirth}"
                                util:GridViewSort.PropertyName="DateOfBirth"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>


<!-- Vista Glass effect -->
<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="Window1"
        my:WinUtil.EnableAeroGlass="True">

...

GridViewSort 소스(btw, 이는 다음을 사용합니다.GridViewColumnHeader.Click오르투스가 언급한 사건)

기호)를 하여 중첩된 유형을 할 수 .+예를 들어, 이 클래스가 있는 경우:

public class SomeClass
{
    public enum SomeEnum
    {
        SomeValue
    };
}

우리는 참조할 수 있습니다.SomeValue다음 구문을 사용하여 XAML로 이동합니다.

{x:Static local:SomeClass+SomeEnum.SomeValue}

이 구문은 MSDN에 문서화되어 있지 않으며 공식적으로 지원되지 않습니다.MSDN 포럼에서 누군가가 그것에 대해 물었고, 분명히 그것은 VS2010의 WPF Designer를 깨뜨렸습니다.Microsoft Connect에서 보고되었습니다.

그리드 크기 공유(좋은 예는 다음과 같습니다).간단히 말해서, 그리드 열과 행이 서로 다른 그리드 간에도 크기를 공유할 수 있습니다.이는 데이터를 편집할 필요 없이 데이터 그리드를 사용하는 모든 사용자에게 매우 유용합니다.

우선 순위 바인딩.비동기 바인딩을 "선착순으로 사용할 수 있습니다.

<TextBlock.Text>
      <PriorityBinding FallbackValue="defaultvalue">
        <Binding Path="SlowestDP" IsAsync="True"/>
        <Binding Path="SlowerDP" IsAsync="True"/>
        <Binding Path="FastDP" />
      </PriorityBinding>
</TextBlock.Text>

정적 팩토리 방법을 x:Factory 방법과 함께 사용

퍼블릭 컨스트럭터가 없지만 정적 팩토리 메소드가 있는 유형이 있는 경우 XAML 2006에서 해당 유형을 코드로 만들어야 했습니다.XAML 2009에서는 x:FactoryMethodx:인수 값을 전달하는 인수 특성입니다.

<!-- XAML 2006 -->
Guid id = Guid.NewGuid();

<!-- XAML 2009 -->
<Guid x:FactoryMethod="Guid.NewGuid" />

고급 "캡션" 속성

또 다른 명확하지 않은 것은 텍스트만 포함하는 데 사용되는 일부 속성의 내용입니다.GUI 요소의 속성이 개체 유형인 경우 텍스트를 설정하는 대신 컨트롤 집합이 포함된 필요한 패널을 추가할 수 있습니다.

은 MenuItem(메뉴 항목)입니다.Header속성(일반적으로 텍스트만 포함)은 패널 컨트롤(또는 하나만 필요한 경우 하나의 GUI 요소만 포함할 수 있습니다.

한참고에 하십시오.Icon속성을 입력합니다.여기에는 일반적으로 이미지 요소가 포함되지만 모든 요소가 포함될 수도 있습니다!

<MenuItem Name="MyMenuItem" Click="MyMenuItem_Click">
  <MenuItem.Icon>
    <Button Click="Button1_Click">i</Button>
  </MenuItem.Icon>
  <MenuItem.Header>
     <StackPanel Orientation="Horizontal" >
        <Label>My text</Label>
        <Button Click="Button2_Click">ClickMe!</Button>
     </StackPanel>
  </MenuItem.Header>
</MenuItem>

XAML 변환기

다음 목록은 WPF 커뮤니티에서 여러 형식을 XAML로 변환하거나 그 반대로 변환하기 위해 개발한 변환기를 보여줍니다.

Adobe Illustrator XAML 내보내기 플러그인

Adobe Photoshop-XAML 변환기

블렌더 XAML 내보내기 플러그인

Lightwave XAML 내보내기 플러그인

Visio XAML 내보내기

3D Studio Max-XAML 변환기

Maya와 XAML 변환기

XAML 변환기로 플래시

SVG-XAML 변환기

WMF/EMF-XAML 변환기

기본 제공 유형

현재 리소스 사전에 문자열 또는 이중과 같은 단순한 유형의 개체를 추가하려면 필요한 clr-namespace를 XML 네임스페이스에 매핑해야 합니다.XAML 2009에는 XAML 언어에 포함된 많은 단순한 유형이 있습니다.

<!-- XAML 2006 -->
<sys:String xmlns:sys="clr-namespace:System;assembly=mscorlib >Test</sys:String>

<!-- XAML 2009 -->
<x:String>Test</x:String>

다음 유형이 XAML 언어에 포함되어 있습니다.

<x:Object/> 
<x:Boolean/> 
<x:Char/> 
<x:String/> 
<x:Decimal/> 
<x:Single/> 
<x:Double/> 
<x:Int16/> 
<x:Int32/> 
<x:Int64/> 
<x:TimeSpan/> 
<x:Uri/> 
<x:Byte/> 
<x:Array/> 
<x:List/> 
<x:Dictionary/> 

{x:Reference}을(를) 사용한 쉬운 개체 참조

오늘 개체 참조를 생성하려면 데이터 바인딩을 수행하고 ElementName을 사용하여 소스를 선언해야 합니다.XAML 2009에서는 새로운 {x:Reference} 마크업 확장을 사용할 수 있습니다.

<!-- XAML 2006 -->
<Label Target="{Binding ElementName=firstName}">FirstName</Label>
<TextBox x:Name="firstName" />

<!-- XAML 2009 -->
<Label Target="{x:Reference firstName}">FirstName</Label>
<TextBox x:Name="firstName" />

시스템 색상 사용

<Border Background="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"/>

임의 사전 키 지원

XAML 2006에서는 모든 명시적 x:Key 값이 문자열로 처리되었습니다.XAML 2009에서는 ElementSyntax에 키를 기록하여 원하는 유형의 키를 정의할 수 있습니다.

<!-- XAML 2006 -->
<StreamGeometry x:Key="CheckGeometry">M 0 0 L 12 8 l 9 12 z</StreamGeometry>

<!-- XAML 2009 -->
<StreamGeometry>M 0 0 L 12 8 l 9 12 z
    <x:Key><x:Double>10.0</x:Double></x:Key>
</StreamGeometry>

코드별 유효성 검사 오류 설정

바인딩 식의 유효성 검사 규칙은 바인딩의 대상 측이 변경된 경우에만 트리거됩니다.코드별로 유효성 검사 오류를 설정하려면 다음 스니펫을 사용할 수 있습니다.

유효성 검사 오류 설정

ValidationError validationError = 
    new ValidationError(regexValidationRule, 
    textBox.GetBindingExpression(TextBox.TextProperty));

validationError.ErrorContent = "This is not a valid e-mail address";

Validation.MarkInvalid(
    textBox.GetBindingExpression(TextBox.TextProperty), 
    validationError);

유효성 검사 오류 지우기

Validation.ClearInvalid(textBox.GetBindingExpression(TextBox.TextProperty));

UI 요소를 텍스트 블록에 채우는 기능

얼마나 유용한지는 모르겠지만(숨겨진 것으로 간주되지만)... 처음 만났을 때는 확실히 당황스러웠습니다.

<Grid x:Name="LayoutRoot">
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid>
            <Rectangle Fill="AliceBlue" Width="25" Height="25"/>
        </Grid>
    </TextBlock>
</Grid>

다음 xaml이 유용할 수 있다고 주장할 수 있습니다(예: 일부 텍스트의 끝에 그래픽을 넣는 것).

<Grid>
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Hello World">
        <TextBlock.Resources>
            <DrawingBrush x:Key="exclamationPoint" Stretch="Uniform">
                <DrawingBrush.Drawing>
                    <DrawingGroup>
                        <DrawingGroup.Children>
                            <GeometryDrawing Brush="#FF375CE2" Geometry="F1 M 7.968,58.164L 0,58.164L 1.914,49.921L 9.882,49.921L 7.968,58.164 Z M 21.796,0L 11.054,42.148L 4.403,42.148L 13.049,0L 21.796,0 Z "/>
                        </DrawingGroup.Children>
                    </DrawingGroup>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </TextBlock.Resources>
        <Grid>
            <Rectangle Width="100" Height="100" Fill="{StaticResource exclamationPoint}"/>
        </Grid>
    </TextBlock>
</Grid>

위의 xaml은 다음과 같이 렌더링됩니다.

안녕 세계

애니메이션 디버깅

일반 오류

다음 오류가 발생하는 경우: 불변 개체 인스턴스에서 '(0).(1)'을(를) 애니메이션으로 만들 수 없습니다.다음 제한 중 하나에 부딪힐 수 있습니다.

  • 로컬 값을 설정하지 않고 종속성 속성을 애니메이션화하고 있습니다.
  • 리소스 사전에 병합되지 않은 다른 어셈블리에 현재 값이 정의된 종속성 속성을 애니메이션화하고 있습니다.
  • 현재 데이터 바인딩된 값을 애니메이션화하고 있습니다.

정보 알림 없이 바인딩속성 변경 또는 종속성 속성

여기에서 논의된 바와 같이, 당신은 INOTIFY 없이 일반 CLR 객체 속성을 바인딩할 수 있습니다.속성이 변경되었습니다. 그러면 작동합니다.

여기 제가 참고하고 있는 포럼 포스트가 있습니다.

인용문:

[...] WPF의 데이터 바인딩 엔진은 소스 개체가 일반 CLR 개체이고 INotify를 구현하지 않는 경우 소스 속성을 래핑하는 PropertyDescriptor 인스턴스에 데이터를 바인딩합니다.속성이 변경된 인터페이스입니다.그리고 데이터 바인딩 엔진은 Property Descriptor를 통해 속성 변경 이벤트에 가입하려고 시도합니다.AddValueChanged() 메서드입니다.그리고 대상 데이터 바인딩 요소가 속성 값을 변경하면 데이터 바인딩 엔진이 Property Descriptor를 호출합니다.SetValue() 메서드를 사용하여 변경된 값을 원본 속성으로 다시 전송하면 ValueChanged 이벤트가 동시에 발생하여 다른 구독자에게 알립니다(이 경우 다른 구독자는 ListBox 내의 TextBlocks가 됩니다).

또한 INNotify를 구현하는 경우PropertyChanged, UI에 바인딩된 데이터가 필요한 속성의 모든 설정자에서 변경 알림을 구현할 책임이 있습니다.그렇지 않으면 변경 내용이 예상대로 동기화되지 않습니다. [...]

여기 그 주제에 대한 또 다른 훌륭하고 상세한 기사가 있습니다.

바인딩을 사용하는 경우에만 작동합니다.코드에서 값을 업데이트하면 변경 내용이 통보되지 않습니다. [...]

INOTIFY 구현PropertyChanged는 지루한 개발 작업이 될 수 있습니다.그러나 WPF 애플리케이션의 런타임 설치 공간(메모리 및 CPU)과 비교하여 이 작업을 고려해야 합니다.INPC를 직접 구현하면 런타임 CPU와 메모리가 절약됩니다.

언급URL : https://stackoverflow.com/questions/1124769/hidden-features-of-wpf-and-xaml

반응형