Действительно ли возможно установить стиль в XAML, который выборочно влияет на средства управления?

Я думаю, что eq + idxmax здесь проще всего для нескольких слов и точных совпадений с гарантией того, что оно есть. Так как это всего 8 слов, возможно, это просто понимание списка и объединение результатов:

Пример данных:

import pandas as pd
import numpy as np

np.random.seed(123)
l = ['']*192 + ['paid', 'foo', 'bar', 'baz']
df = pd.DataFrame([np.random.choice(l, replace=False, size=196)
                   for i in range(5)])

Код:

pd.concat([df.eq(word).idxmax(1).rename(word) for word in ['paid', 'foo', 'bar', 'baz']], 
          axis=1)

#   paid  foo  bar  baz
#0   112  167  184  142
#1   186   93   17  173
#2    56  142  179   67
#3    15   78   38   79
#4   116   84   18   61
<час>

Если вы нужно только проверять столбцы [4: 196] использовать df.iloc[:, 4:197].eq(word) вместо проверки каждого столбца

9
задан Theo Lenndorff 29 March 2009 в 15:24
поделиться

2 ответа

У Вас есть несколько опций, представленных здесь в порядке того, как хорошо они масштабируются.

Опция 1: Определите Стиль без ключа на более низком уровне

Можно засунуть ресурс в WrapPanel уровень так, чтобы это только влияло на средства управления в этом WrapPanel:

<WrapPanel>
    <WrapPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="5,0,5,0"/>
        </Style>
    </WrapPanel.Resources>

    <!-- TextBlocks here -->
</WrapPanel>

Заметьте отсутствие ключа. Это Style будет относиться ко всем TextBlocks в WrapPanel.

Опция 2: Определите Стиль с ключом и снова без на более низком уровне

Если Вы определяете Style в более высоком уровне с ключом можно затем определить другого Style на более низком уровне без ключа и основе это Style на высокоуровневом:

<Window>
    <Window.Resources>
        <Style TargetType="TextBlock" x:Key="textBlockStyle">
            <Setter Property="Margin" Value="5,0,5,0"/>
        </Style>
    </Window.Resources>

    <WrapPanel>
        <WrapPanel.Resources>
            <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/>
        </WrapPanel.Resources>

        <!-- TextBlocks here -->
    </WrapPanel>
</Window>

Это приводит к a Style быть автоматически относившимся TextBlocks в WrapPanel, но не снаружи. Кроме того, Вы не копируете детали Style - они хранятся в более высоком уровне.

Опция 3: Поместите Стили в ResourceDictionary и выборочно объедините его

Наконец, можно поместить Ваш Styles в отдельном ResourceDictionary и выборочно слияние, что словарь в управление Resources набор:

<!-- TextBlockStyles.xaml -->
<ResourceDictionary>
    <Style TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,5,0"/>
    </Style>
</ResourceDictionary>

<!-- Window.xaml -->
<Window>
    <WrapPanel>
        <WrapPanel.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="TextBlockStyles.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </WrapPanel.Resources>
    </WrapPanel>
</Window>

<!-- Alternative Window.xaml if you have only one RD to merge in -->
<Window>
    <WrapPanel>
        <WrapPanel.Resources>
            <ResourceDictionary Source="TextBlockStyles.xaml"/>
        </WrapPanel.Resources>
    </WrapPanel>
</Window>

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

17
ответ дан 4 December 2019 в 11:08
поделиться

да, можно сделать, that.you почти имеют верное представление. Вы делаете это как это....

<WrapPanel>
< WrapPanel. Resources >
<Style TargetType="{x:Type TextBlock}">
        <Setter Property="Margin" Value="5,0,5,0"/>
    </Style>
</WrapPanel.Resources/>
        <TextBlock Server</TextBlock>
        <TextBlock >IP</TextBlock>
        <TextBlock >Port</TextBlock>
        <TextBlock >Status</TextBlock>
    </WrapPanel>

при помощи {x:type} синтаксиса Вам не нужен x:key, он установит стиль для всего textblocks в wrappanel., если Вы захотите различные стили, можно все еще использовать x:key, и explicity устанавливают стиль на textblock.

2
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

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