c#中带变量的不同调用WPF

时间:2014-11-27 13:07:14

标签: c# wpf

现在我有多个按钮和其他元素。其中每个都有一个x:名称和一个内容。

我还有一个列表,其中包含与x:WPF部件名称相同的元素。

我的目标是拥有一个可以反复调用的函数,给它一个元素的x:name,并设置列表中名称后面的值({name1,value,name2,value,name3, value ..})到具有该名称的WPF元素的内容。

例如:

我有一个清单:


    config {tree,1,chair,4,window,3,dollar,200}

和WPF元素:

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

现在我想调用一个函数,给它配置{}和x:Name =&#34; chair&#34;。 它应该搜索一个元素&#34; chair&#34;现在在配置中,然后用内容中的12替换4。 现在我想用下一个Button(x:Name =&#34; tree&#34;)来调用它来将值1更改为5;

我真的不知道,如何正确描述:(

这是我现在的功能:

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

        }

myWindow.NAME.Content.ToString();部分不起作用,因为我不能使用变量。

有什么办法,我还能这样做吗?

提前致谢:D

3 个答案:

答案 0 :(得分:0)

您可以通过从绑定到多个按钮的Click事件转换发件人来访问按钮属性。像这样:

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

答案 1 :(得分:0)

这个例子适合我。您必须在WPF表单上为您的Container命名(例如:网格), 并使用方法“FindName(string)”,如下所示:

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>

代码背后:

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模式,则无法使用。

希望它有所帮助。

答案 2 :(得分:0)

您好像使用的是List<T>,就像它是KeyValuePair提供商一样,请尝试将List<T>替换为Dictionary<T, U>

此外,您可以在code-behind中使用单一方法管理所有Button OnClick events,这样您就不必添加新的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;
        }
    }
}