Скрытые функции WPF и XAML?

Как другие отметили, distutils.sysconfig имеет соответствующие настройки:

import distutils.sysconfig
print distutils.sysconfig.get_python_lib()

..., хотя значение по умолчанию site.py делает что-то немного более сырое, перефразируемое ниже:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(это также добавляет ${sys.prefix}/lib/site-python и добавляет оба пути для sys.exec_prefix также, должен что постоянный отличаться).

Однако каков контекст? Вы не должны смешивать с Вашим site-packages непосредственно; setuptools/distutils будет работать на установку, и Ваша программа может работать в virtualenv, где Ваш pythonpath абсолютно локален для пользователя, таким образом, это не должно принимать использование системных пакетов сайта непосредственно также.

123
задан 21 revs, 3 users 59% 25 September 2017 в 20:52
поделиться

22 ответа

3.5sp1 ввел StringFormat в выражения привязки, например

<TextBox Text="{Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}" />
44
ответ дан 24 November 2019 в 01:09
поделиться

Мультисвязка (в сочетании с StringFormat ):

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0}, {1}">
      <Binding Path="LastName" />
      <Binding Path="FirstName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
87
ответ дан 24 November 2019 в 01:09
поделиться

Не совсем скрытая функция, но с WPF / XAML вы получаете Bea Stollnitz и Josh Smith . Королева и король программирования WPF / XAML.

18
ответ дан 24 November 2019 в 01:09
поделиться

3.5sp1 представил TargetNullValue для привязок. Это установит для связанного свойства значение Null, если значение введено, и если ваше свойство равно Null, оно отобразит это значение.

<TextBox Text="{Binding Total, TargetNullValue=$0.00}" />
44
ответ дан 24 November 2019 в 01:09
поделиться

Совместное использование размера сетки ( вот хороший пример). Короче говоря, столбцы и строки сетки могут иметь одинаковый размер даже в разных сетках. Это будет бесценно для всех людей, использующих DataGrids без необходимости редактировать данные на месте.

14
ответ дан 24 November 2019 в 01:09
поделиться

Есть также трюк PresentationTraceSources.TraceLevel для отладки того, что происходит с привязками в любом конкретном сценарии. Все, что вам нужно сделать, это сослаться на пространство имен System.Diagnostics в сборке WindowsBase

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 
58
ответ дан 24 November 2019 в 01:09
поделиться

Расширенные свойства «заголовка»

Еще одна вещь, которая не очень ясна, - это содержимое некоторых свойств, которые, как мы привыкли, содержат только текст. Если свойство элемента графического интерфейса относится к типу Object, весьма вероятно, что вы можете, вместо того, чтобы просто устанавливать текст, добавить панель по вашему желанию, которая включает набор элементов управления.

Примером этого является MenuItem, где свойство Header (которое обычно содержит только текст) может содержать набор элементов графического интерфейса, заключенных в элемент управления панелью (или только один элемент графического интерфейса, если вам нужно просто one).

Также обратите внимание на свойство Icon в MenuItem. Обычно он содержит элемент изображения, но он также может содержать что угодно!

<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
ответ дан 24 November 2019 в 01:09
поделиться

Добавление эффекта Aero в окно

  <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
ответ дан 24 November 2019 в 01:09
поделиться

Мои любимые функции - расширения разметки и присоединенные свойства, они позволяют очень элегантно расширять «словарь» 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 (кстати, он использует событие GridViewColumnHeader.Click , упомянутое Ортусом)

18
ответ дан 24 November 2019 в 01:09
поделиться

Иногда вы получаете строку, слишком длинную для отображения на этикетке. В этом случае мы можем использовать свойство TextTrimming объекта TextBlock , чтобы показать эллипсы

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

Ссылка MSDN

29
ответ дан 24 November 2019 в 01:09
поделиться

Отладка анимации

Общие ошибки

Если вы получаете следующую ошибку: Не удается анимировать '(0). (1)' на неизменяемом экземпляре объекта. возможно, вы столкнулись с одним из следующих ограничений:

  • Вы анимируете свойство зависимости без установки локального значения
  • Вы анимируете свойство зависимости, текущее значение которого определено в другой сборке, которая не объединена с словарь ресурсов.
  • Вы анимируете значение, которое в настоящее время привязано к данным
1
ответ дан 24 November 2019 в 01:09
поделиться

Показать всплывающую подсказку для отключенного элемента управления

Wpf позволяет отображать всплывающую подсказку для элемента управления, если он находится в отключенном состоянии.

Например

<Button Content="Disabled Button" ToolTipService.ShowOnDisabled="True" IsEnabled="False" ToolTip="This is a disabled button"/> 
19
ответ дан 24 November 2019 в 01:09
поделиться

Поддержка произвольных ключей словаря

В 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>
3
ответ дан 24 November 2019 в 01:09
поделиться

Установить ValidationError по коду

ValidatioRule в BindingExpression срабатывает только при изменении целевой стороны привязки. Если вы хотите установить ошибку проверки по коду, вы можете использовать следующий фрагмент.

Установить ошибку проверки

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
ответ дан 24 November 2019 в 01:09
поделиться

Простые ссылки на объекты с {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" />
6
ответ дан 24 November 2019 в 01:09
поделиться

Встроенные типы

Если вы хотите добавить объекты простых типов, таких как 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/> 
6
ответ дан 24 November 2019 в 01:09
поделиться

Использование конструкторов не по умолчанию с аргументами 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>
19
ответ дан 24 November 2019 в 01:09
поделиться

Универсальные шаблоны в XAML с x: TypeArguments

Если вы хотите использовать ObservableCollection в XAML, вам необходимо создать тип, производный от ObservableCollection, потому что вы не можете объявить его в 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 />
21
ответ дан 24 November 2019 в 01:09
поделиться

Использование статических заводских методов с x: FactoryMethod

Если у вас есть тип, не имеющий общедоступных конструктор, но статический фабричный метод, вам нужно было создать этот тип в коде XAML 2006. В XAML 2009 вы можете использовать атрибут x: FactoryMethodx: Arguments для передачи значений аргументов.

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

<!-- XAML 2009 -->
<Guid x:FactoryMethod="Guid.NewGuid" />
10
ответ дан 24 November 2019 в 01:09
поделиться

PriorityBinding . Позволяет использовать асинхронные привязки в порядке «первым пришел - первым показан»:

<TextBlock.Text>
      <PriorityBinding FallbackValue="defaultvalue">
        <Binding Path="SlowestDP" IsAsync="True"/>
        <Binding Path="SlowerDP" IsAsync="True"/>
        <Binding Path="FastDP" />
      </PriorityBinding>
</TextBlock.Text>
11
ответ дан 24 November 2019 в 01:09
поделиться

Использование системных цветов

<Border Background="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"/>
6
ответ дан 24 November 2019 в 01:09
поделиться