WPF DependencyProperties

Вы можете получить довольно хорошее ускорение для второй части проблемы (которую вы делаете посредством поиска по словарю), используя только Numpy. Я заменил поиск по словарю путем индексации в массив Numpy.

Я генерирую массив Numpy в начале. Одна хитрость заключается в том, чтобы понять, что буквы могут быть преобразованы в базовое число, которое представляет их, используя ord. Для строки ASCII это всегда между 0 и 127:

_base642bin_array = np.zeros((128,),dtype=np.uint8)
for i in range(len(_base64chars)):
    _base642bin_array[ord(_base64chars[i])] = i

Я выполняю преобразование в 1 и 0 в функции n_decompress, используя встроенную функцию numpy.

def n_decompress2(compressed_vector):
    # encode is for Python 3: str -> bytes
    decompressed_b64 = "".join(_decompress_get(compressed_vector)).encode()
    # byte string into the underlying numeric data
    decompressed_b64 = np.fromstring(decompressed_b64,dtype=np.uint8)
    # conversion done by numpy indexing rather than dictionary lookup
    vectorized = _base642bin_array[decompressed_b64]
    # convert to a 2D array of 1s and 0s
    as_binary = np.unpackbits(vectorized[:,np.newaxis],axis=1)
    # remove the two digits you don't care about (always 0) from binary array
    as_binary = as_binary[:,2:]
    # reshape to 1D (and chop off two at the end)
    return as_binary.ravel()[:-2]

Это дает мне 2,4-кратную скорость по сравнению с вашей версией (обратите внимание, что я вообще не изменил _decompress_get, поэтому оба времени включают в себя ваш _decompress_get) только от использования Numpy (без Cython / Numba, и Я подозреваю, что они не слишком помогут). Я думаю, что главное преимущество заключается в том, что индексирование в массив с числами происходит быстрее по сравнению с поиском в словаре.


_decompress_get, вероятно, можно улучшить с помощью Cython, но это значительно сложнее ...

6
задан Giffyguy 26 July 2009 в 17:39
поделиться

5 ответов

Можно использовать ElementName, Связывающий здесь, элементом будет само Окно.

<Window x:Class="WpfToolTip.Window1"
x:Name="_window"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <Button Click="OnClick" Content="OK" />
        <Button Click="OnCancel" Content="Cancel" />
        <TextBlock Text="{Binding Path=Problem,ElementName=_window}" />
</StackPanel>

2
ответ дан 8 December 2019 в 16:12
поделиться

Это - Окно, в котором это установлено.

public partial class Window1 : Window
{
    public string Problem
    {
        get { return (string)GetValue(ProblemProperty); }
        set { SetValue(ProblemProperty, value); }
    }

    public static readonly DependencyProperty ProblemProperty =
                    DependencyProperty.Register(
                    "Problem",
                    typeof(string),
                    typeof(Window1));


    public Window1()
    {
        InitializeComponent();

        Problem = "ifowiof";
    }

    public void OnClick(object sender, EventArgs e)
    {
        Problem = "behl";
    }

    public void OnCancel(object sender, EventArgs e)
    {
       Problem = "eioeopje";
    }
}

XAML:

<Window x:Class="WpfToolTip.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel>
            <Button Click="OnClick" Content="OK" />
            <Button Click="OnCancel" Content="Cancel" />
            <TextBlock Text="{Binding Path=Problem}" />
    </StackPanel>
</Window>

Это работает, если я установил RelativeSource как Вы сказал, когда это загружается, но если я изменяюсь Problem свойство в коде вручную (т.е. через нажатие кнопки) это никогда не обновляет TextBlock с новым значением.

0
ответ дан 8 December 2019 в 16:12
поделиться

Проблема то, что вы имели определенно связана с Вашим DataContext. {Обязательное} расширение должно знать, где жизни свойства, с которыми Вы связываете. Местоположение по умолчанию, на которое это смотрит, является элементами DataContext, который по умолчанию всегда устанавливается на DataContext, он - родительский элемент. При обходе DataContext логическое дерево к родительскому окну DataContext был бы пустым (потому что DataContext окна является пустым). Поэтому Ваш {Привязка} на Вашем textblock говорит, "Связывают мое текстовое свойство с проблемой roperty моего DataContext..., который является пустым.

Существует несколько способов решить это. Нужно было бы сделать точно так же, как Jobi упомянул и установил свойство Element Вас связывающий для указания на Окно, где DependencyProperty определяется как это:

<TextBlock Text="{Binding Path=Problem,ElementName=_window}" />

Другая опция состояла бы в том, чтобы установить DataContext Вашего Окна для указания на себя. Тем путем все элементы содержали в, он доволен, будет все иметь DataContext окна.

<Window ....
        DataContext="{Binding RelativeSource={RelativeSource Self}}">

Теперь каждый раз, когда Вам нужно к привязке к свойствам, определенным в окне (как Ваше проблемное свойство зависимости), затем можно просто сделать это:

<TextBlock Text="{Binding Problem}" />
11
ответ дан 8 December 2019 в 16:12
поделиться

В Вашем коде Вы регистрируете Свойство Зависимости для класса TextBox (последняя строка цитаты).

общедоступный статический DependencyProperty ProblemProperty только для чтения =
DependencyProperty. Регистр (
"Проблема",
typeof (строка),
typeof (Текстовое поле));

Таким образом, можно установить значение для ProblemProperty только для текстовых полей, но я не могу найти текстовое поле ни в одном из фрагментов кода. Необходимо зарегистрировать свойство зависимости для типа, которому значение будет присвоено от образца, правильный выбор не очевиден для меня. Вы, как Micah делает, могли определить его, чтобы быть DP окна, затем установить свойство на Вашем инстанцированном окне. Или Вы могли определить его к любому именованному объекту зависимости в окне, т.е. некоторому объекту с Name=m_ContentElement, и затем установить Вашу привязку к
{Binding ElementName=m_ContentElement, Path=Problem}
или короче:
{Binding Problem, ElementName=m_ContentElement}

0
ответ дан 8 December 2019 в 16:12
поделиться

Есть два способа понять причину описанной вами проблемы.

Для начала нужно попробовать установить обработчик изменения свойства (в объявлении свойства зависимостей) и поставить там точку останова. Вы увидите, меняется ли ваша собственность или нет.

Во-вторых, вы должны проверить тип владельца свойства зависимостей.

Не могли бы вы показать полный код xaml и программный код?

0
ответ дан 8 December 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: