【问题标题】:Passing Textbox As A Parameter from Xaml to Click Button Event将文本框作为参数从 Xaml 传递到单击按钮事件
【发布时间】:2019-05-01 09:42:55
【问题描述】:

我有几个文本框,默认值为 10,每个框有两个相邻的按钮,这些按钮用于将文本框的值增加 1 或单击后减少 1。 我知道我可以简单地为每个按钮创建一个单击事件处理程序,但我想这样做,因此该方法可能会通过从 xaml 传递它来找到指定的文本框。 如果这样做很明显,请原谅我,但我很难过。

我很喜欢绑定,但不知道如何利用它来让它发挥作用。

<Grid Background="DarkMagenta" Margin="0,0,0,-31">
    <StackPanel Orientation="Vertical" HorizontalAlignment="Center" Margin="0,10, 0, 20">
        <Label>Set Your Stats!</Label>
        <StackPanel Orientation="Vertical" HorizontalAlignment="Left">
            <Label>Strenght</Label>
            <StackPanel Orientation="Horizontal">
                <TextBox  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                    <Button Click="Button_Click">+</Button>
                    <Button>-</Button>
                </StackPanel>

            </StackPanel>
            <Label>Dexterity</Label>
            <StackPanel Orientation="Horizontal">
                <TextBox  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                    <Button>+</Button>
                    <Button>-</Button>
                </StackPanel>
            </StackPanel>

            <Label>Constitution</Label>
            <StackPanel Orientation="Horizontal">
                <TextBox  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                    <Button>+</Button>
                    <Button>-</Button>
                </StackPanel>
            </StackPanel>

            <Label>Intelligence</Label>
            <StackPanel Orientation="Horizontal">
                <TextBox  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                    <Button>+</Button>
                    <Button>-</Button>
                </StackPanel>
            </StackPanel>

            <Label>Wisdom</Label>
            <StackPanel Orientation="Horizontal">
                <TextBox  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                    <Button>+</Button>
                    <Button>-</Button>
                </StackPanel>
            </StackPanel>

            <Label>Charisma</Label>
            <StackPanel Orientation="Horizontal">
                <TextBox  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                    <Button>+</Button>
                    <Button>-</Button>
                </StackPanel>
            </StackPanel>
        </StackPanel>
        <Button HorizontalAlignment="Stretch" Margin="80,0,80,0" >Continue</Button>

    </StackPanel>

CS。文件方法

public partial class StatSelection : Page
{
    CharacterDetails charDetails = new CharacterDetails();
    public StatSelection(CharacterDetails addedDetails)
    {
        charDetails = addedDetails;
        InitializeComponent();
    }

    private void IncrementBy1(object sender, RoutedEventArgs e)
    {
        // code for incrementing the textbox by 1
    }
}

我希望该方法有一个或两个方法,这些方法可以根据每次调用时传递给该方法的文本框来找到要递增的正确文本框。

【问题讨论】:

  • 看起来您并没有真正使用绑定,基本上您可以将每个按钮的单击事件分配给同一个 EventHandler 并为每个控件命名。在您的 Click EventHandler 中,您可以使用带有 name 属性的 switch 来确定单击了哪个按钮以及要修改哪个文本框的文本框名称。

标签: c# wpf xaml button textbox


【解决方案1】:

您可以尝试以下代码,它会找到与按钮关联的文本框并将值增加 1。

private void IncrementBy1(object sender, RoutedEventArgs e)
    {
        // code for incrementing the textbox by 1
        Button btn = sender as Button;

        var parent = VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(btn));
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var textBox = VisualTreeHelper.GetChild(parent, i) as TextBox;
            if (textBox != null)
            {
                var value = int.Parse(textBox.Text);
                textBox.Text = (++value).ToString();
                break;
            }
        }

    }

【讨论】:

    【解决方案2】:

    感谢 user2818985 和 Nawed Nabi Zada 的回答。 根据您的建议,我找到了一种对所有按钮仅使用一次单击事件的方法!

      <Grid Background="DarkMagenta" Margin="0,0,0,-31">
        <StackPanel Orientation="Vertical" HorizontalAlignment="Center" Margin="0,10, 0, 20">
            <Label>Set Your Stats!</Label>
            <StackPanel Orientation="Vertical" HorizontalAlignment="Left">
                <Label>Strenght</Label>
                <StackPanel Orientation="Horizontal">
                    <TextBox x:Name="StrTxtBx"  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                    <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                        <Button x:Name="StrIncrease" Click="IncreaseDecrease">+</Button>
                        <Button x:Name="StrDecrease" Click="IncreaseDecrease">-</Button>
                    </StackPanel>
    
                </StackPanel>
                <Label>Dexterity</Label>
                <StackPanel Orientation="Horizontal">
                    <TextBox x:Name="DexTxtBx"  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                    <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                        <Button x:Name="DexIncrease" Click="IncreaseDecrease">+</Button>
                        <Button x:Name="DexDecrease" Click="IncreaseDecrease">-</Button>
                    </StackPanel>
                </StackPanel>
    
                <Label>Constitution</Label>
                <StackPanel Orientation="Horizontal">
                    <TextBox x:Name="ConTxtBx"  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                    <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                        <Button x:Name="ConIncrease" Click="IncreaseDecrease">+</Button>
                        <Button x:Name="ConDecrease" Click="IncreaseDecrease">-</Button>
                    </StackPanel>
                </StackPanel>
    
                <Label>Intelligence</Label>
                <StackPanel Orientation="Horizontal">
                    <TextBox x:Name="IntTxtBx"  Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                    <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                        <Button x:Name="IntIncrease" Click="IncreaseDecrease">+</Button>
                        <Button x:Name="IntDecrease" Click="IncreaseDecrease">-</Button>
                    </StackPanel>
                </StackPanel>
    
                <Label>Wisdom</Label>
                <StackPanel Orientation="Horizontal">
                    <TextBox x:Name="WisTxtBx" Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                    <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                        <Button x:Name="WisIncrease" Click="IncreaseDecrease">+</Button>
                        <Button x:Name="WisDecrease" Click="IncreaseDecrease">-</Button>
                    </StackPanel>
                </StackPanel>
    
                <Label>Charisma</Label>
                <StackPanel Orientation="Horizontal">
                    <TextBox x:Name="ChrTxtBx" Margin="10,10,2,10" MinHeight="10" MaxHeight="20" MinWidth="15" MaxWidth="20">10</TextBox>
                    <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                        <Button x:Name="ChrIncrease" Click="IncreaseDecrease">+</Button>
                        <Button x:Name="ChrDecrease" Click="IncreaseDecrease">-</Button>
                    </StackPanel>
                </StackPanel>
            </StackPanel>
            <Button HorizontalAlignment="Stretch" Margin="80,0,80,0" >Continue</Button>
    
        </StackPanel>
    
    </Grid>
    

    Cs 代码

      private void IncreaseDecrease(object sender, RoutedEventArgs e)
        {
            string btnName = ((Button)sender).Name;
            int TxtBxVal;
            switch(btnName)
            {
                case "StrIncrease":
                    TxtBxVal = int.Parse(StrTxtBx.Text);
                    StrTxtBx.Text = (++TxtBxVal).ToString();
                    break;
    
                case "StrDecrease":
                    TxtBxVal = int.Parse(StrTxtBx.Text);
                    StrTxtBx.Text = (--TxtBxVal).ToString();
                    break;
    
                case "DexIncrease":
                    TxtBxVal = int.Parse(DexTxtBx.Text);
                    DexTxtBx.Text = (++TxtBxVal).ToString();
                    break;
    
                case "DexDecrease":
                    TxtBxVal = int.Parse(DexTxtBx.Text);
                    DexTxtBx.Text = (--TxtBxVal).ToString();
                    break;
    
                case "ConIncrease":
                    TxtBxVal = int.Parse(ConTxtBx.Text);
                    ConTxtBx.Text = (++TxtBxVal).ToString();
                    break;
    
                case "ConDecrease":
                    TxtBxVal = int.Parse(ConTxtBx.Text);
                    ConTxtBx.Text = (--TxtBxVal).ToString();
                    break;
    
                case "IntIncrease":
                    TxtBxVal = int.Parse(IntTxtBx.Text);
                    IntTxtBx.Text = (++TxtBxVal).ToString();
                    break;
    
                case "IntDecrease":
                    TxtBxVal = int.Parse(IntTxtBx.Text);
                    IntTxtBx.Text = (--TxtBxVal).ToString();
                    break;
    
                case "WisIncrease":
                    TxtBxVal = int.Parse(WisTxtBx.Text);
                    WisTxtBx.Text = (++TxtBxVal).ToString();
                    break;
    
                case "WisDecrease":
                    TxtBxVal = int.Parse(WisTxtBx.Text);
                    WisTxtBx.Text = (--TxtBxVal).ToString();
                    break;
    
                case "ChrIncrease":
                    TxtBxVal = int.Parse(ChrTxtBx.Text);
                    ChrTxtBx.Text = (++TxtBxVal).ToString();
                    break;
    
                case "ChrDecrease":
                    TxtBxVal = int.Parse(ChrTxtBx.Text);
                    ChrTxtBx.Text = (--TxtBxVal).ToString();
                    break;
            }
    
        }
    

    有了这个,盒子可以根据需要增加和减少。
    将来可能会考虑削减它的方法,但现在我对它很满意。 再次感谢你们!

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 2021-01-20
      • 2018-06-27
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多