Попытка создать несколько событий для нескольких динамически генерируемых элементов List<T> в Windows 8 API

Я создаю приложение для Windows 8, и мне нужно, чтобы события возникали во время события GotFocus для элемента TextBox. Я не уверен, что не так или в каком направлении идти именно как 1. Я не очень хорош для событий в C# для начала, и 2. Я считаю, что это немного отличается в WindowsRT. Метод TextBoxListArray() запускается через другое событие.

public sealed partial class MainPage : Page
{
    List<TextBox> textBox = new List<TextBox>();
    List<RichEditBox> editBox = new List<RichEditBox>();
    static int tally;
    public MainPage()
    {
        this.InitializeComponent();
    }

    private void TextBoxListArray()
    {
        textBox.Add(new TextBox());
        int i = textBox.Count();
        i = i - 1;
        tally = i - 1;
        textBox[i].HorizontalAlignment = HorizontalAlignment.Stretch;
        textBox[i].VerticalAlignment = VerticalAlignment.Top;
        textBox[i].TextWrapping = TextWrapping.NoWrap;
        textBox[i].Margin = new Thickness(10);
        textBox[i].Text = i.ToString();
        textBox[i].IsReadOnly = true;
        textBox[i].Height = 40;
        stackNotes.Children.Add(textBox[i]);
        textBox[i].GotFocus += new EventHandler(TextBoxList_GotFocus);
    }

    private void TextBoxList_GotFocus(object sender, RoutedEventArgs e)
    {
        textBox[tally] = sender as TextBox;
        textBox[tally].Background = new SolidColorBrush(Colors.Yellow); 
    }
}

3 ответа

Решение

Проблема с вашим кодом использует tally получить выделенный пункт из списка. так как у вас есть sender Параметр вы можете привести его к TextBox, а затем установить фон.

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

private void TextBoxListArray()
{
    var tb =  new TextBox() { Text = textBox.Count(), ....... };
    tb.GotFocus += new EventHandler(TextBoxList_GotFocus);
    textBox.Add(tb);
    stackNotes.Children.Add(tb);
}

private void TextBoxList_GotFocus(object sender, RoutedEventArgs e)
{
     var txtBox = sender as TextBox;
     txtBox.Background = new SolidColorBrush(Colors.Yellow); 
}

Это right way делать то, что вы ищете в WPF (или любой из основанных на XAML фреймворков UI)

<Window x:Class="MiscSamples.TextBoxItemsControlSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TextBoxItemsControlSample" Height="300" Width="300">
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Path=.}" x:Name="TextBox"/>
                <DataTemplate.Triggers>
                    <Trigger SourceName="TextBox" Property="IsKeyboardFocusWithin" Value="True">
                        <Setter TargetName="TextBox" Property="Background" Value="Yellow"/>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

Код позади:

public partial class TextBoxItemsControlSample : Window
{
    public TextBoxItemsControlSample()
    {
        InitializeComponent();

        DataContext = Enumerable.Range(0, 100).Select(x => "Text" + x.ToString());

    }
}

Результат:

  • Это не single строка кода, которая манипулирует любым элементом пользовательского интерфейса. Тебе это не нужно. Привязка данных достаточно мощна, чтобы устранить необходимость во всех ужасных хакерских атаках, которые были распространены в инфраструктурах пользовательского интерфейса динозавров.
  • Trigger делает фон TextBox желтым всякий раз, когда IsKeyboardFocusWithin верно для любого данного TextBox. Это устраняет необходимость в процедурных подходах.
  • Я не проверял это в WinRT XAML. Могут быть различия (например, разные имена свойств и т. Д.).
  • Вы можете дополнительно настроить пользовательский интерфейс, определив свойства ItemsControl (такие как ItemsPanel).
  • WPF / XAML породы. Просто скопируйте и вставьте мой код в File -> New Project -> WPF Application и посмотрите результаты самостоятельно.

Вот что я сделал, чтобы это сработало. Это определенно хак, но он получил нужный мне результат. Я также попробую "правильный" путь через XAML.

private void TextBoxListArray()
    {
        textBox.Add(new TextBox());
        int i = textBox.Count();
        i = i - 1;
        tally = i - 1;
        textBox[i].HorizontalAlignment = HorizontalAlignment.Stretch;
        textBox[i].VerticalAlignment = VerticalAlignment.Top;
        textBox[i].TextWrapping = TextWrapping.NoWrap;
        textBox[i].Margin = new Thickness(10);
        textBox[i].Text = i.ToString();
        textBox[i].IsReadOnly = true;
        textBox[i].Height = 40;
        stackNotes.Children.Add(textBox[i]);
        textBox[i].GotFocus += new RoutedEventHandler(TextBoxList_GotFocus);
        textBox[i].LostFocus += new RoutedEventHandler(TextBoxList_LostFocus);
    }

    private void TextBoxList_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox textBoxSender = sender as TextBox;
        textBoxSender.Background = new SolidColorBrush(Colors.Beige);
    }

    private void TextBoxList_LostFocus(object sender, RoutedEventArgs e)
    {
        TextBox textBoxSender = sender as TextBox;
        textBoxSender.Background = new SolidColorBrush(Colors.White);
    }
Другие вопросы по тегам