none
Программно менять свойство у ListBoxItem RRS feed

  • Вопрос

  • Здравствуйте. Имеется листбокс, в нем объявляется массив стрингов. Мне нужно, чтобы когда пользователь дважды щелкнул на одной мыши (не даблклик, тут по времени может сколько угодно времени пройти) на кнопке менялся фон у ListBoxItem, причем заранее неизвестно, на какой (красный или зеленый). Вопрос: как это можно сделать? И проблема еще в том, что у меня в листбоксе хранятся строки. Как-то так:

    private void FormLoaded(object sender, RoutedEventArgs e) { for (int i = 15, j = 1000000; i >= 0; i--, j /=2) listBox.Items.Add(string.Format("{0,8}\t{1,-13}", i.ToString(), j.ToString())); }

    <Window x:Class="WpfApplication4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="450" Width="525" Loaded="FormLoaded">
        <Window.Resources>
            <SolidColorBrush x:Key="NormalItemBackground">Black</SolidColorBrush>
            <SolidColorBrush x:Key="NormalItemForeground">Orange</SolidColorBrush>
            <SolidColorBrush x:Key="SelectedItemForeground" >Black</SolidColorBrush>
            <SolidColorBrush x:Key="CheckPointItemForeground">White</SolidColorBrush>
            <RadialGradientBrush x:Key="SolvedItemBackground">
                <RadialGradientBrush.GradientStops>
                    <GradientStop Color="White" Offset="0.0"/>
                    <GradientStop Color="Green" Offset="0.2"/>
                </RadialGradientBrush.GradientStops>
            </RadialGradientBrush>
            
            <RadialGradientBrush x:Key="SelectedItemBackground">
                <RadialGradientBrush.GradientStops>
                    <GradientStop Color="White" Offset="0.0"/>
                    <GradientStop Color="Orange" Offset="0.8"/>
                    <GradientStop Color="Black" Offset="1"/>
                </RadialGradientBrush.GradientStops>
            </RadialGradientBrush>
            
            <Style x:Key="ListboxItemStyle" TargetType="ListBoxItem">
                <Setter Property="Margin" Value="3" />
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="Background" Value="{StaticResource NormalItemBackground}" />
                <Setter Property="Foreground" Value="Orange"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid>
                                <Border Background="{TemplateBinding Background}" />
                                <ContentPresenter Margin="15,3" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Background" Value="{StaticResource SelectedItemBackground}" />
                                    <Setter Property="Foreground" Value="{StaticResource SelectedItemForeground}" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style x:Key="ListBoxStyle" TargetType="ListBox">
                <Setter Property="ItemContainerStyle" Value="{StaticResource ListboxItemStyle}" />
                <Setter Property="Margin" Value="5" />
                <Setter Property="Background" Value="Black"/>
                <Setter Property="Foreground" Value="White"/>
            </Style>
        </Window.Resources>
        <Grid Background="Black" RenderTransformOrigin="0.5,0.5">
            <ListBox x:Name="listBox" Style="{StaticResource ListBoxStyle}" SelectionMode="Multiple" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5,5,0,0" />
        </Grid>
    </Window>


    19 октября 2012 г. 5:11

Ответы

  • Да нет, уже решено. Просто он строки упаковывает в ListBoxItem, а я сразу сделал так

     for (int i = 15, j = 1000000; i >= 0; i--, j /=2)
                    listBox.Items.Add(new ListBoxItem { Content = string.Format("{0,8}\t{1,-13}", i.ToString(), j.ToString()) });

    После этого спокойно мог сделать что хотел:

            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (_i !=0)
                    ((ListBoxItem)listBox.Items[_i]).Tag = "Solved";
                ((ListBoxItem) listBox.Items[_i++]).IsSelected = true;
            }

    А в XAML вот так:

    <Style x:Key="ListboxItemStyle" TargetType="ListBoxItem">
                <Setter Property="Margin" Value="3" />
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="Background" Value="{StaticResource NormalItemBackground}" />
                <Setter Property="Foreground" Value="Orange"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid>
                                <Border Background="{TemplateBinding Background}" />
                                <ContentPresenter Margin="15,3" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Background" Value="{StaticResource SelectedItemBackground}" />
                                    <Setter Property="Foreground" Value="{StaticResource SelectedItemForeground}" />
                                </Trigger>
                                <Trigger Property="Tag" Value="Solved">
                                    <Setter Property="Background" Value="{StaticResource SolvedItemBackground}" />
                                    <Setter Property="Foreground" Value="{StaticResource SelectedItemForeground}" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

    • Помечено в качестве ответа PsilonRus 19 октября 2012 г. 17:25
    19 октября 2012 г. 17:24

Все ответы

  • Надеюсь, что понял вас правильно.

    Если требуется помнить состояние каждого из элементов, то можно создать объект, имеющий в качестве полей строку и счетчик нажатий. Биндим коллекцию объектов на листбокс. Затем в событии нажатия на элемент меняем его счетчик, а по значению счетчика уже делать все необходимое, например биндить различные свойства ListBoxItem со счетчиком с использованием конвертера.

    • Изменено Gregory.K 19 октября 2012 г. 10:38
    19 октября 2012 г. 10:33
  • Да нет, уже решено. Просто он строки упаковывает в ListBoxItem, а я сразу сделал так

     for (int i = 15, j = 1000000; i >= 0; i--, j /=2)
                    listBox.Items.Add(new ListBoxItem { Content = string.Format("{0,8}\t{1,-13}", i.ToString(), j.ToString()) });

    После этого спокойно мог сделать что хотел:

            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (_i !=0)
                    ((ListBoxItem)listBox.Items[_i]).Tag = "Solved";
                ((ListBoxItem) listBox.Items[_i++]).IsSelected = true;
            }

    А в XAML вот так:

    <Style x:Key="ListboxItemStyle" TargetType="ListBoxItem">
                <Setter Property="Margin" Value="3" />
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="Background" Value="{StaticResource NormalItemBackground}" />
                <Setter Property="Foreground" Value="Orange"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid>
                                <Border Background="{TemplateBinding Background}" />
                                <ContentPresenter Margin="15,3" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Background" Value="{StaticResource SelectedItemBackground}" />
                                    <Setter Property="Foreground" Value="{StaticResource SelectedItemForeground}" />
                                </Trigger>
                                <Trigger Property="Tag" Value="Solved">
                                    <Setter Property="Background" Value="{StaticResource SolvedItemBackground}" />
                                    <Setter Property="Foreground" Value="{StaticResource SelectedItemForeground}" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

    • Помечено в качестве ответа PsilonRus 19 октября 2012 г. 17:25
    19 октября 2012 г. 17:24