Поля ListBox / Rectangle, изменение внешнего вида выбранного элемента, привязка для выбранного элемента - PullRequest
1 голос
/ 08 ноября 2010

Несколько вопросов относительно ListBox здесь (на самом деле 3)

alt text

1.ListBoxItem / Rectangle Margins

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

<ListBox.ItemTemplate>
    <DataTemplate>
        <Rectangle Width="20" Height="20" Margin="1,2,2,2">
            <Rectangle.Fill>
                <SolidColorBrush Color="{Binding}" />
            </Rectangle.Fill>
        </Rectangle>
    </DataTemplate>
</ListBox.ItemTemplate>

2.Как я могу изменить внешний вид выбранного элемента?

Я не хочу этот синий фон, могу ли я просто иметь рамку?

Я попробовал пример из Изменить WPFDataTemplate для элемента ListBox, если он выбран

с этим кодом

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Rectangle Width="20" Height="20" Margin="1,2,3,2">
                        <Rectangle.Fill>
                            <SolidColorBrush Color="{Binding}" />
                        </Rectangle.Fill>
                    </Rectangle>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Border BorderBrush="DarkGray" BorderThickness="1">
                                <Rectangle Width="20" Height="20" Margin="1,2,3,2">
                                    <Rectangle.Fill>
                                        <SolidColorBrush Color="{Binding}" />
                                    </Rectangle.Fill>
                                </Rectangle>
                            </Border>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</ListBox.ItemContainerStyle>

и получил что-то вроде

alt text

3,Привязка для выбранного элемента

Я пытаюсь привязать выбранный цвет к свойству модели вида.Если цвет в модели представления не существует в списке предоставленных цветов, цвет не должен быть выбран.Думайте об этом как об альтернативном способе выбора цвета, у меня есть выбор цветов с помощью ползунков RGB / HSB.Я попытался

<ListBox ItemsSource="{Binding ThemeColors}" SelectedValue="{Binding Color}" SelectionChanged="ListBox_SelectionChanged" ...

, затем в C #

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var listBox = (ListBox)sender;
    if (listBox.SelectedValue != null) 
        Color = (Color)listBox.SelectedValue;
}

Но после этого, когда я пытаюсь выбрать цвета с помощью ползунков, я получаю некоторые странные рывки, а иногда цвет всегда возвращается обратно кцвет, выбранный из списка.Но иногда все работает нормально, я совсем запутался.

1 Ответ

2 голосов
/ 08 ноября 2010

1.ListBoxItem поставляется с Padding по умолчанию "2,0,0,0", поэтому маржа выглядит так.Это можно изменить в ItemContainerStyle объекта ListBox

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="Padding" Value="0,0,0,0"/>
    </Style>
</ListBox.ItemContainerStyle>

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

2.Чтобы удалить фон и отобразить только границу, я думаю, вам нужно будет повторно использовать шаблон ListBoxItem и изменить триггеры, чтобы использовать BorderBrush вместо фона для границы.Я не уверен, что понимаю, что вы хотите сделать

...