Попытка создать несколько событий для нескольких динамически генерируемых элементов 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);
}