WPF 및 XAML의 숨겨진 기능?


123

다음은 다양한 언어에 대해 논의 된 많은 숨겨진 기능입니다. 이제 XAML 및 WPF의 숨겨진 기능에 대해 궁금합니다.

내가 찾은 것은 ListView의 헤더 클릭 이벤트입니다.

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

GridViewColumnHeader.Click 속성이 나열되지 않습니다.

지금까지 몇 가지 관련 기능 :

또한보십시오:

  1. C #의 숨겨진 기능
  2. Python의 숨겨진 기능
  3. ASP.NET의 숨겨진 기능
  4. Perl의 숨겨진 기능
  5. 자바의 숨겨진 기능
  6. VB.NET의 숨겨진 기능
  7. PHP의 숨겨진 기능
  8. Ruby의 숨겨진 기능
  9. C의 숨겨진 기능
  10. 등등........

7
여기 msdn.microsoft.com/en-us/library/…를보십시오 . click 이벤트는 ButtonBase에서 상속됩니다. 설명하는 것은 WPF ( msdn.microsoft.com/en-us/library/bb613550.aspx ) 의 매우 강력한 개념 인 첨부 된 이벤트 입니다. 이렇게하면 그리드에 100 개의 버튼과 1 개의 핸들러 만있는 <Grid Button.Click>을 할 수 있습니다.
Sorskoot

1
첫번째 I에서 "오, 우리가 다시 간다"처럼했지만, 난 모든 다시 가져 그래서 그때 응답에서 뭔가를 배운 : O를 : 오
샘 하웰

1
커뮤니티 위키이어야합니다
tsilb

2
@tsilb 나는이 링크에서 봐 가지고, 그것은 커뮤니티 위키해야한다고 생각하지 않습니다 meta.stackexchange.com/questions/392/...
Prashant Cholachagudda

답변:


87

멀티 바인딩 (StringFormat과 결합) :

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

1
굉장합니다 :-) silverlight 4 또는 이전 버전을 사용하지 않는 한. 손가락 V5에 대한 교차
Simon_Weaver

5
이것은 훌륭하지만 그렇게하지 않으려는 유혹을받을 것입니다. 문자열을 작성해야하는 경우이를 논리로 분류하고 출력을 단위 테스트하고 싶습니다. 이와 같은 것은 때때로 뷰 모델에서 string.Format ()으로 더 나은 경우가 있습니다.
Iain Holder

58

특정 시나리오에서 바인딩으로 진행되는 작업을 디버깅하는 PresentationTraceSources.TraceLevel 트릭도 있습니다. WindowsBase 어셈블리에서 System.Diagnostics 네임 스페이스를 참조하기 만하면됩니다.

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 

4
VisualStudio 2010에서는 추적 설정 수준을 경고로 설정해야합니다! stackoverflow.com/questions/2802662/…
WaltiD

44

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

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

44

3.5sp1은 바인딩 표현식에 StringFormat을 도입했습니다.

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

내가 그 기능을 얼마나 좋아하는지 말로 표현할 수 없습니다. 나는 수많은 가치 변환기가 주변에 누워있는 것을 싫어했습니다.
Rob

예, 가장 시간을 절약하는 기능 중 하나가 추가되었습니다. 특히 TargetNullValue와 결합하면 많은 문제가 해결됩니다.
Bryan Anderson

6
있는 StringFormat 주위에 작은 따옴표를 두는 것은 일부 컴파일러 경고를 제거해야 -Text={Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}"
라이언 Versaw에게

알아서 반가워요. 그냥 무시하는 데 익숙해졌습니다.
Bryan Anderson

1
임의의 형식 지정 문자열이 작동한다는 것을 전달하려고했습니다. 이 경우 국제화 된 버전은 StringFormat = '{} {0 : d}'라고 생각합니다.
Bryan Anderson

29

때때로 라벨에 표시하기에는 너무 긴 문자열이 표시됩니다. 이 경우 타원을 표시하기 위해의 TextTrimming속성을 사용할 수 있습니다.TextBlock

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

MSDN 링크


이러한 경우 도구 설명을 추가하는 것이 좋습니다
surfen

27

창에 에어로 효과 추가

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

1
코드를 추가했지만 여전히 Aero 효과를 추가하지 않습니다. 내가 뭔가를 놓치고 있습니까?
Elmo

21

x : TypeArguments를 사용하는 XAML의 제네릭

XAML에서 ObservableCollection을 사용하려면 XAML에서 선언 할 수 없기 때문에 ObservableCollection에서 파생되는 형식을 만들어야합니다. 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 />

1
불행히도 x : TypeArguments는 느슨한 xaml 파일에서만 사용할 수 있으며 컴파일 된 파일이 아닙니다. (
kevindaub

네, 느슨한 xaml 전용 :( 대다수의 WPF 개발자에게 XAML2009는 쓸모가 없습니다.
Grigory

19

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

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

예를 들면

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

19

x : Arguments와 함께 기본이 아닌 생성자 사용

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>


18

마크 업 확장과 연결된 속성은 제가 가장 좋아하는 기능입니다.이를 통해 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.ClickOrtus에서 언급 한 이벤트 사용 )


출처가 WinUtil.EnableAeroGlass어딘가에 있습니까?
Oskar

예,하지만 게시 한 이후로 많이 변경되었습니다. 이제 EnableBlur 및 GlassFrameMargins의 2 가지 속성이 있습니다. 당신은 여기에 코드를 찾을 수 있습니다 projets.developpez.com/projects/dvp-net/repository/entry/trunk/...
토마스 레베

15

더하기 기호 ( +)를 사용하여 XAML에서 중첩 된 형식을 참조 할 수 있습니다 . 예를 들어,이 클래스가 있다면 :

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

SomeValue다음 구문을 사용하여 XAML에서 참조 할 수 있습니다.

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

이 구문은 MSDN에 문서화되어 있지 않으며 공식적으로 지원되지 않습니다. 누군가 MSDN 포럼에서 그것에 대해 물었고 분명히 VS2010의 WPF 디자이너가 망가졌습니다. 그것은 한 보고 된 마이크로 소프트 연결에.


14

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


11

PriorityBinding . "선착순"순서로 asyn 바인딩을 사용할 수 있습니다.

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

10

x : FactoryMethod와 함께 정적 팩토리 메서드 사용

공용 생성자가 없지만 정적 팩토리 메서드가있는 형식이있는 경우 XAML 2006의 코드에서 해당 형식을 만들어야했습니다. XAML 2009에서는 x : FactoryMethodx : Arguments 특성을 사용하여 인수 값을 전달할 수 있습니다.

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

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

7

고급 "캡션"속성

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

이에 대한 예는 MenuItem입니다. 여기서 Header속성 (일반적으로 텍스트 만 포함)은 패널 컨트롤에 래핑 된 gui 요소 집합 (또는 필요한 경우 하나의 gui 요소)을 포함 할 수 있습니다.

또한 IconMenuItem 의 속성에 유의하십시오 . 여기에는 일반적으로 이미지 요소가 포함되지만 여기에는 모든 항목이 포함될 수도 있습니다!

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

7

또한 매우 유용합니다 : GridLengthConverter, BooleanToVisibilityConverter, 모든 System.Windows.Controls에서 AlternationConverter
Maciek Świszczowski

6

내장 유형

오늘날 리소스 사전에 string 또는 double과 같은 단순한 유형의 개체를 추가하려면 필요한 clr- 네임 스페이스를 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/> 

WPF를 사용하여 XAML을 처리하는 경우에는 작동하지 않습니다. msdn.microsoft.com/en-us/library/ee792007.aspx
scobi

6

{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" />

x:ReferenceXAML 2009 언어 기능이지만 컴파일 된 XAML에서도 작동하는 몇 가지 시나리오 가 있다는 점은 주목할 가치가 있습니다. 그러나 모든 곳에서 작동하지 않으며 XAML 디자이너보기가 손상 될 수 있습니다.
Mike Strobel

1
@MikeStrobel : 그것은 거의 모든 곳에서 작동합니다.
HB

6

시스템 색상 사용

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

3
응용 프로그램이 실행되는 동안 사용자가 시스템 색상을 변경할 수 있으므로 DynamicResource로 지정하는 것이 중요합니다.
M. Dudley 2011 년

3

임의 사전 키 지원

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>

2

코드로 ValidationError 설정

BindingExpression의 ValidatioRule은 바인딩의 대상 쪽이 변경 될 때만 트리거됩니다. 코드로 유효성 검사 오류를 설정하려면 다음 스 니펫을 사용할 수 있습니다.

유효성 검사 오류 설정

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

2

UIElement (s)를 TextBlock에 채우는 기능

나는 이것이 얼마나 유용한 지 모르겠다 (숨겨진 것으로 자격이 있음) ...하지만 처음 만났을 때 확실히 나를 놀라게했습니다 .

<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은 다음과 같이 렌더링됩니다.

Hello World


1

애니메이션 디버깅

일반적인 오류

다음 오류가 발생하는 경우 : 변경할 수없는 개체 인스턴스에서 '(0). (1)'을 애니메이션 할 수 없습니다. 다음 제한 사항 중 하나가 발생할 수 있습니다.

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

1

INotifyPropertyChanged 또는 DependencyProperties없이 바인딩

설명하고있는 바와 같이 여기 당신은에서 INotifyPropertyChanged없이 일반 CLR 개체 속성을 바인딩 할 수 있습니다, 그것은 것입니다 그냥 작동 .

여기 제가 언급하고 있는 Forumpost 가 있습니다.

인용문:

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

INotifyPropertyChanged를 구현하는 경우 UI에 데이터를 바인딩해야하는 속성의 모든 setter에서 변경 알림을 구현할 책임이 있습니다. 그렇지 않으면 예상대로 변경 사항이 동기화되지 않습니다. [...]

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

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

INotifyPropertyChanged를 구현하는 것은 상당히 지루한 개발 작업이 될 수 있습니다. 그러나 WPF 애플리케이션의 런타임 풋 프린트 (메모리 및 CPU)와 비교하여 해당 작업을 평가해야합니다. INPC를 직접 구현하면 런타임 CPU와 메모리가 절약됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.