【问题标题】:How to access controls in Button.Content in code-behind?如何在代码隐藏中访问 Button.Content 中的控件?
【发布时间】:2012-07-25 08:08:17
【问题描述】:

在 XAML 中,我创建了一个这样的按钮:

<Button MouseEnter="Button_MouseEnter">
    <Button.Content>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>

            <TextBlock Grid.Row="0" Text="asd"/>
            <Label Grid.Row="1" Content="xxx"/>
            <Label Grid.Row="2" Content="yyy"/>
        </Grid>
    </Button.Content>
</Button>

现在我需要在代码隐藏中访问 Button 内容中的其中一个控件。假设我需要一个 TextBlock。

private void Button_MouseEnter(object sender, MouseEventArgs e)
    {
        Button button = (Button)sender;
        // ? 
    }

我该怎么做? 此外,我还有多个像这样使用数据绑定自动创建的按钮。 我需要访问这些控件的原因是我想在某些情况下为其中一个设置动画。

【问题讨论】:

  • 是否尝试过直接在 XAML 中使用触发器来为您的按钮设置动画?
  • 你的 button.Content 应该是一个网格,对吧?你可以投射它。
  • 我的动画需要大量计算,我不想为此创建太多转换器。 @LuisFilipe:成功了 :) 就这么简单。谢谢!

标签: c# wpf button controls


【解决方案1】:
        private void Button_MouseEnter(object sender, MouseEventArgs e)
    {
        Button b = sender as Button;
        TextBox textBox = null;
        if (b != null)
        {
            foreach (var frameworkElement in ((Grid)b.Content).Children)
            {
                if (frameworkElement is TextBox)
                {
                    textBox = (TextBox)frameworkElement;
                    break;
                }
            }

        }
    }

这只是为了说明如何提取 Grid 的子元素,即按钮的内容。我希望这能帮助你理解这个想法。

【讨论】:

  • 很好的答案!你能告诉我是否可以以编程方式将&lt;Button.Content&gt;(在本例中为整个Grid元素)标签内的按钮内容插入到我以编程方式创建的另一个按钮中?
【解决方案2】:

你的button.Content应该是一个Grid,对吧?你可以投射它。

【讨论】:

    【解决方案3】:

    如果你想改变这些东西,我建议使用 MVVM 模式和 DataBinding!

    => 为文本创建一个属性并将文本框绑定到该文本,而不是只需更改此属性,按钮就会更改其文本。请参阅 MVVM 的 PropertyChanged-Event!

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多