WPF ve xaml gizli özellikleri?

burada dil çeşitliliği için tartışılan gizli özellikleri çok sayıda. Şimdi xaml ve WPF'NİN bazı gizli özelliklerini merak ediyorum?

bulduğum bir liste görünümü

başlık tıklama olayıdır
<ListView x:Name='lv' 
      Height="150" 
      GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">

GridViewColumnHeader.Click özelliği listelenmez.

şimdiye kadar ilgili bazı özellikler:

Ayrıca bakınız:

  1. C#
  2. gizli özellikleri
  3. Python'un gizli özellikleri
  4. gizli özellikleri ASP.NET
  5. Perl
  6. gizli özellikleri
  7. Java
  8. gizli özellikleri
  9. gizli özellikleri VB.NET
  10. PHP
  11. gizli özellikleri
  12. Ruby'nin gizli özellikleri
  13. Gizli özellikleri C
  14. Ve Benzeri........
123
tarihinde sordu Sauron 2009-07-14 15:19:55
kaynak

25 ответов

Multibinding (StringFormat ile birlikte):

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0}, {1}">
      <Binding Path="LastName" />
      <Binding Path="FirstName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
87
cevap Julien Poulin 2011-07-12 11:26:25
kaynak

ayrıca Mevcutturkaynaklar.TraceLevel, herhangi bir senaryoda bağlamalarla neler olup bittiğini hata ayıklamak için hile yapar. Yapmanız gereken tek şey sistemi referans etmektir.Tanılama ad alanı içinde WindowsBase derleme

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

ve ardından aşağıdaki bağlama ifadesine ekleyin:

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

günlüğü şöyle olacak:

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 
58
cevap idursun 2009-07-14 18:15:22
kaynak

3.5sp1 tanıtılan TargetNullValue bağlamaları. Bu değeri girilirse ve özellik Null ise bu değeri görüntüler bound özelliği Null olarak ayarlanır.

<TextBox Text="{Binding Total, TargetNullValue='151900920'.00}" />
44
cevap Bryan Anderson 2009-07-14 18:02:57
kaynak

3.5sp1, stringformat'ı bağlama ifadelerine tanıttı, örneğin

<TextBox Text="{Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}" />
44
cevap Bryan Anderson 2009-09-11 07:21:18
kaynak

bazen etiket üzerinde göstermek için çok uzun dize olsun. Bu durumda TextTrimming Elipsleri TextBlock göstermek için TextBlock özelliğini kullanabiliriz

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

MSDN Link

29
cevap Prashant 2010-01-04 17:16:55
kaynak

pencereye Aero etkisi ekleme

  <Window.Resources>
    <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, 
        PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
</Window.Resources>
27
cevap Sauron 2009-09-07 16:11:51
kaynak

Xaml'de X:TypeArguments

bir ObservableCollection xaml içinde kullanmak istiyorsanız, türetilen bir tür oluşturmanız gerekir ObservableCollection xaml içinde bildiremezsiniz çünkü. Xaml 2009 ile kullanabileceğiniz x:TypeArguments genel bir tür türünü tanımlamak için öznitelik.

<!-- 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 />
21
cevap Sauron 2009-09-10 16:16:37
kaynak

devre dışı bırakılmış bir denetimde araç ipucu göster

WPF devre dışı durumda ise, bir denetim araç ipucu göstermek için izin verir.

örneğin

<Button Content="Disabled Button" ToolTipService.ShowOnDisabled="True" IsEnabled="False" ToolTip="This is a disabled button"/> 
19
cevap Sauron 2009-09-10 09:04:43
kaynak

X ile varsayılan olmayan Kurucuların kullanımı: argümanlar

xaml 2006 nesnelerinde bunları kullanmak için ortak bir varsayılan oluşturucuya sahip olmalıdır. Xaml 2009'da x:Arguments sözdizimini kullanarak oluşturucu bağımsız değişkenleri geçirebilirsiniz.

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

<!-- XAML 2009 -->
<DateTime>
    <x:Arguments>
        <x:Int64>100</x:Int64>
    </x:Arguments>
</DateTime>
19
cevap Sauron 2009-09-10 16:12:42
kaynak

gerçekten gizli bir özellik değil, WPF/XAML ile Bea Stollnitz ve Josh Smith alırsınız . Kraliçe ve WPF/xaml programlama Kralı.

18
cevap Bryan Anderson 2009-07-14 19:30:14
kaynak

biçimlendirme uzantıları ve ekli özellikler benim en sevdiğim özelliklerdir, XAML "kelime dağarcığını" çok zarif bir şekilde genişletmenizi sağlarlar.

biçimlendirme uzantıları

<!-- 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}"/>

ekli özellikler

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

...

kaynak için GridViewSort (btw, GridViewColumnHeader.Click Ortus tarafından belirtilen olay kullanır)

18
cevap Thomas Levesque 2009-08-24 16:29:20
kaynak
İç içe türü için XAML ( + ) işaretini kullanarak başvurabilirsiniz '151940920. Örneğin, bu sınıfa sahip olsaydık:

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

aşağıdaki sözdizimini kullanarak xaml'de SomeValue e başvurabiliriz:

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

bu sözdizimi MSDN üzerinde belgelenmemiş ve resmen desteklenmiyor. Birisi , MSDN forumlarında hakkında sordu ve görünüşe göre VS2010'IN WPF Tasarımcısını kırdı. Bu rapor edilmiştir Microsoft Connect.

15
cevap M. Dudley 2011-01-12 22:13:38
kaynak

Izgara boyutu paylaşımı ( işte iyi bir örnek). Uzun hikaye kısa hatta farklı ızgaralar arasında, ızgara sütunları ve satır payı boyutları olabilir. Bu, verileri yerinde düzenlemenize gerek kalmadan DataGrids kullanan tüm insanlar için çok değerli olacaktır.

14
cevap Bryan Anderson 2009-07-14 18:07:39
kaynak

PriorityBinding .

: bir "first come first show" sipariş asyn bağlamaları kullanmanıza izin verir
<TextBlock.Text>
      <PriorityBinding FallbackValue="defaultvalue">
        <Binding Path="SlowestDP" IsAsync="True"/>
        <Binding Path="SlowerDP" IsAsync="True"/>
        <Binding Path="FastDP" />
      </PriorityBinding>
</TextBlock.Text>
11
cevap Sergey Aldoukhov 2010-03-06 00:27:45
kaynak

X ile statik Fabrika yöntemlerinin kullanımı: FactoryMethod

hiçbir ortak oluşturucu ama statik bir fabrika yöntemi olan bir türü olduğunda bu tür kod XAML 2006 içinde oluşturmak zorunda kaldı. Xaml 2009 ile kullanabileceğiniz x:FactoryMethodx:Arguments bağımsız değişken değerlerini geçirmek için öznitelik.

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

<!-- XAML 2009 -->
<Guid x:FactoryMethod="Guid.NewGuid" />
10
cevap Sauron 2009-09-10 16:01:44
kaynak

gelişmiş "başlık" özellikleri

çok açık olmayan bir başka şey, yalnızca metin içeren bazı özelliklerin içeriğidir. Bir GUI öğesinin özelliği type nesnesi ise, metni ayarlamak yerine, bir dizi denetim içeren ihtiyacınızın bir panelini ekleyebileceğiniz çok muhtemeldir.

bunun bir örneği, Header özelliğinin (normalde sadece metin içeren) Menuıtem'tir. bir panel denetimine sarılmış bir dizi guı öğesi (ya da sadece bir guı öğesine ihtiyacınız varsa) içerir.

ayrıca Menuıtem Icon özelliğini not edin. Bu normalde bir görüntü öğesi içerir, ancak bu da bir şey içerebilir!

<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
cevap awe 2009-09-07 10:45:38
kaynak

yerleşik türleri

dize veya çift kaynak sözlüğü gibi basit türde nesneleri eklemek istiyorsanız, gerekli clr-ad alanlarını bir XML ad alanlarına eşlemeniz gerekir. Xaml 2009 biz xaml dili dahil basit türleri bir sürü.

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

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

aşağıdaki türler xaml diline dahil edilir:

<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/> 
6
cevap Sauron 2009-09-10 16:05:38
kaynak

{X:Reference}

ile kolay nesne başvuruları

bugün bir nesne başvurusu oluşturmak istiyorsanız, bir databinding yapmanız ve kaynağı bir ElementName ile bildirmeniz gerekir. Xaml 2009'da yeni {X:Reference} biçimlendirme uzantısını

kullanabilirsiniz
<!-- 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" />
6
cevap Sauron 2009-09-10 16:09:04
kaynak

Sistem Renkleri Kullanımı

<Border Background="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"/>
6
cevap SeeSharp 2010-06-15 08:20:17
kaynak

keyfi Sözlük tuşları için destek

İn xaml 2006 tüm açık x:anahtar değeri dizeleri olarak kabul edildi. Xaml 2009 yılında anahtar ElementSyntax yazarak istediğiniz anahtar her türlü tanımlayabilirsiniz.

<!-- 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>
3
cevap Sauron 2011-01-13 18:39:56
kaynak

koduna göre bir ValidationError ayarlayın

bir ValidatioRule bir BindingExpression yalnızca tetikler, ne zaman bağlama hedef tarafı değişir. Kodla bir doğrulama hatası ayarlamak istiyorsanız, aşağıdaki snippet'i kullanabilirsiniz.

doğrulama hatasını

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

doğrulama hatasını Temizle

Validation.ClearInvalid(textBox.GetBindingExpression(TextBox.TextProperty));
2
cevap Sauron 2009-09-10 16:21:04
kaynak

Uıelement(ler) i Bir metin bloğuna doldurma yeteneği

bunun ne kadar yararlı olduğunu bilmiyorum (gizli olarak nitelendiriliyor)... ama ilk kez :

ile karşılaştığımda beni korumadan yakaladı
<Grid x:Name="LayoutRoot">
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid>
            <Rectangle Fill="AliceBlue" Width="25" Height="25"/>
        </Grid>
    </TextBlock>
</Grid>

aşağıdaki xaml'in yararlı olabileceğini iddia edebilirsiniz (yani, bazı metnin sonunda bir grafik koymak):

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

yukarıdaki xaml aşağıdaki gibi işler:

Hello World

2
cevap cplotts 2017-05-23 15:25:24
kaynak

Hata Ayıklama Animasyonları

Sık Karşılaşılan Hatalar

aşağıdaki hatayı alırsanız: canlandıramazsınız '(0).(1)' değişmez bir nesne örneğinde.

: bu aşağıdaki sınırlamalardan biri haline çalıştırmak olabilir
  • bir bağımlılık özelliğini yerel bir değer ayarlamadan canlandırıyorsunuz
  • geçerli değeri tanımlanan bir bağımlılık özelliği animasyon kaynak sözlüğüne birleştirilmemiş başka bir derleme.
  • şu anda databound olan bir değeri canlandırıyorsunuz
1
cevap Sauron 2009-09-10 16:41:18
kaynak

İNotifyPropertyChanged veya DependencyProperties olmadan bağlama

tartışıldığı gibi burada INotifyPropertyChanged olmadan düz bir CLR nesne özelliğini bağlayabilirsiniz ve sadece çalışacaktır .

İşte Forumpost atıfta bulunuyorum.

alıntı:

[...] WPF veri bağlama motor veri bağlama olacak PropertyDescriptor kaynak nesne düz bir CLR nesnesi ve uygulamazsa source özelliği sarar örnek INotifyPropertyChanged arabirimi. Ve veri bağlama altyapısı abone olmaya çalışacaktır property changed olay aracılığıyla PropertyDescriptor.AddValueChanged() yöntemi. Ve hedef veri bağlı öğe özellik değerlerini değiştirdiğinizde, veri bağlama altyapısı arayacak PropertyDescriptor.SetValue () değiştirilen değeri geri aktarmak için yöntemi source özelliği, ve aynı anda yükseltmek ValueChanged olay diğer aboneleri bildirmek için (bu durumda, diğer aboneleri olacak Textblocks içinde ListBox.

ve inotifypropertychanged uyguluyorsanız, veri UI bağlı olması gereken özelliklerin her ayarlayıcı değişiklik bildirimi uygulamak için tamamen sorumludur. Aksi takdirde, değişiklik beklediğiniz gibi senkronize edilmeyecektir.[...]

işte başka bir büyük ve ayrıntılı makale konu.

not bu sadece bağlama kullanırken çalışır . kodundan değerlerini güncellerseniz, değişikliği hakkında bilgilendirilmez . [...]

İnotifypropertychanged uygulanması sıkıcı geliştirme çalışmalarının adil bir bit olabilir. Ancak, karşı bu işi tartmak gerekir WPF uygulamanızın çalışma zamanı ayak izi (bellek ve CPU). uygulama INPC kendiniz çalışma zamanı CPU ve bellek kurtaracak .

1
cevap UrbanEsc 2017-05-23 15:32:13
kaynak

Diğer sorular wpf xaml hidden-features