2014-11-27 2 views
0

прямо сейчас у меня есть несколько кнопок и других элементов. Каждый из них имеет x: имя и контент.Различные вызовы с переменными в C# | WPF

У меня также есть список, который имеет элементы с теми же именами, что и x: Название частей WPF.

Моя цель состоит в том, чтобы иметь функцию, которую я могу перезвонить снова и снова, дайте ей x: имя элемента и задает значение после имени в списке ({name1, value, name2, value, name3 , значение ..}) к содержимому элемента WPF с этим именем.

Например:

У меня есть список:


конфигурации {дерево, 1, стул, 4, окна, 3, доллар, 200}

и WPF элементы:

<Button x:Name="chair" Content="12"/> 
<Button x:Name="tree" Content="5"/> 

Теперь я хочу вызвать функцию, задав ей конфигурацию {} и x: Name = "chair". Теперь он должен искать элемент «стул» в конфиге и заменить 4 после этого на 12 из Контента. Теперь я хочу позвонить ему со следующей кнопкой (x: Name = "tree"), чтобы изменить значение от 1 до 5;

Я действительно не знаю, как описать, что правильно :(

Это функция я прямо сейчас:

public void SetConfig(List<string> config, string name) 
     { 
      config[config.IndexOf(name) + 1] = myWindow.name.Content.ToString(); 

     } 

В myWindow.NAME.Content.ToString(); часть не работает, потому что я не могу использовать переменную в том, что

есть ли способ, я все еще могу это сделать

Спасибо заранее:.? D

+0

вы могли бы попробовать использовать ответы от http://stackoverflow.com/questions/636383/how -can-i-find-wpf-controls-by-name-or-type для доступа к вашим элементам управления. – Herm

ответ

0

Этот пример работает для меня. Вы должны дать имя вашему контейнер на форме WPF (пример: сетка), и использовать метод "FindName (строка)", как это:

XAML:

<Grid Name="LayoutRoot"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="chair" Content="12" Grid.Column="0" Click="chair_Click"/> 
     <Button x:Name="tree" Content="5" Click="tree_Click" Grid.Column="1"/> 
    </Grid> 

Код Behind :

public partial class MainWindow : Window 
    { 

     List<string> config = new List<string>() { "tree", "1", "chair", "4", "window", "3", "dollar", "200" }; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void tree_Click(object sender, RoutedEventArgs e) 
     { 
      SetConfig(config, this.tree.Name); 
     } 

     private void chair_Click(object sender, RoutedEventArgs e) 
     { 
      SetConfig(config, this.chair.Name); 
     } 

     public void SetConfig(List<string> config, string name) 
     { 
      config[config.IndexOf(name) + 1] = ((Button)LayoutRoot.FindName(name)).Content.ToString(); 

     }  
    } 

Обратите внимание: если вы работаете с шаблоном MVVM, это неприменимо.

Надеюсь, это поможет.

+1

Это исправлено для меня. Большое спасибо! Я не создал сетку, как вы, но использовал ((Button) myWindow.FindName (имя)). Content.ToString(); – 1stkeks

0

Вы можете получить доступ к свойствам кнопок, отправив отправителя из события Click, связанного с несколькими кнопками. Например:

private void Click(object sender, RoutedEventArgs e) 
    { 
     Title = ((Button) sender).Name; 
    } 
0

Это выглядит так, как будто вы используете List<T>, как если бы это был KeyValuePair поставщик, попробуйте заменить ваш List<T> с Dictionary<T, U>.

Также вы можете использовать один метод в code-behind управлять всеми ButtonOnClickevents, так что вам не нужно, чтобы добавить новый OnClick обработчик для каждого дополнительного Button.

MainWindow.xaml

<Window x:Class="SO.Q_27171497.Wpf.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <Button x:Name="chair" Content="12" Click="Button_OnClick"/> 
     <Button x:Name="tree" Content="5" Click="Button_OnClick"/> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

namespace SO.Q_27171497.Wpf 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows; 
    using System.Windows.Controls; 

    public partial class MainWindow 
    { 
     private readonly Dictionary<string, int> config = new Dictionary<string, int> 
     { 
      {"tree", 1}, 
      {"chair", 4}, 
      {"window", 3}, 
      {"dollar", 200} 
     }; 

     public MainWindow() 
     { 
      this.InitializeComponent(); 
     } 

     private void Button_OnClick(object sender, RoutedEventArgs e) 
     { 
      var button = sender as Button; 
      if (button == null) 
      { 
       return; 
      } 
      button.Content = this.config.FirstOrDefault(c => String.CompareOrdinal(button.Name, c.Key) == 0).Value; 
     } 
    } 
} 
Смежные вопросы