XAML 如何访问事件处理程序中按钮中的文本框?

5uzkadbs  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(111)

我想打印信息的元素在消息框中,但我不知道如何获得访问按钮内的文本框。

<Button Grid.Row="5" Grid.Column="2"
                Background="#FF9935"
                BorderBrush="#FF9935"
                Margin="0,0,0,5"
                Click="Button_Click">

            <Button.Resources>
                <Style TargetType="Border">
                    <Setter Property="CornerRadius" Value="5"></Setter>
                </Style>
            </Button.Resources>

            <Grid Height="66" Width="67">
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>

                <TextBlock VerticalAlignment="Top" Grid.Row="0" FontSize="9">38</TextBlock>
                <TextBlock VerticalAlignment="Center" Grid.Row="1" FontSize="20" FontWeight="Bold">Sr</TextBlock>
                <TextBlock Grid.Row="2" FontSize="10" FontWeight="DemiBold">Strontium</TextBlock>
                <TextBlock Grid.Row="3" FontSize="8">87.62</TextBlock>
            </Grid>
        </Button>

字符串
XAML

private void Button_Click(object sender, RoutedEventArgs e)
        {

        }


UI
所以我想在信息框中打印有关化学元素的信息时,用户按下它

dkqlctbz

dkqlctbz1#

您可以使用VisualTreeHelper搜索单击按钮的子元素,以查找具有特定属性的元素。
例如,这个helper函数将查找类型为TextBlock且具有特定FontSize的子元素,并返回其内容。

public static string FindTextBlockTextByFontSize(DependencyObject depObj, double fontSize)
{
    
    // For all child elements
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        // Get the child via VisualTreeHelper
        var child = VisualTreeHelper.GetChild(depObj, i);

        if ((child is TextBlock textBlock) && textBlock.FontSize == fontSize)
        {
            // If the child is a TextBlock and has the specified FontSize, return its content
            return textBlock.Text;
        }
        else
        {
            // Recurse to check this element's child elements
            string result = FindTextBlockTextByFontSize(child, fontSize);
            if (result != null) return result;
        }
    }

    // If none are found, return null
    return null;
}

字符串
然后你可以像这样使用这个helper函数:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button clickedButton = sender as Button;

    string atomicNumber = FindTextBlockTextByFontSize(clickedButton, 9);
    string abbreviation = FindTextBlockTextByFontSize(clickedButton, 20);
    string fullName = FindTextBlockTextByFontSize(clickedButton, 10);
    string weight = FindTextBlockTextByFontSize(clickedButton, 8);

    MessageBox.Show(atomicNumber + " " + abbreviation + " " + fullName + " " + weight);
}


这是一个快速和肮脏的解决方案,但不是一个非常专业的方法。专业的方法看起来像这样:
有一个ChemicalElement类,代表一种化学元素及其所有属性。
保持一个列表或其他数据结构与所有已知的化学元素。
使用WPF数据或控件模板来定义期间表中的条目应如何基于到ChemicalElement类型示例的绑定。然后,您可以从OnClick事件直接访问绑定的ChemicalElement及其所有属性。

相关问题