【问题标题】:How to get TextBlock's Text value out of a StackPanel inside a Button in WPF如何从 WPF 中按钮内的 StackPanel 中获取 TextBlock 文本值
【发布时间】:2015-09-08 04:43:18
【问题描述】:

我想知道如何从 WPF 中按钮内的 StackPanel 内的 TextBlock 中获取文本值,它非常像这样:

public MainWindow()
{
    Image img = new Image();
    img.Source = new BitmapImage(new Uri("image.png"));

    StackPanel stackPnl = new StackPanel();
    stackPnl.Orientation = Orientation.Vertical;
    stackPnl.Margin = new Thickness(10);
    stackPnl.Children.Add(img);

    TextBlock txtBlck = new TextBlock();
    txtBlck.Text = "this is a test!";
    stackPnl.Children.Add(txtBlck);

    Button btn = new Button();
    btn.Content = stackPnl;
    btn.Click += test_click;
    myPanel.Children.Add(btn);
}

还有 test_click:

private void test_click(object sender, RoutedEventArgs e)
{
    txtBox.Text = (sender as Button).Content.ToString();
}

现在我点击按钮后得到的当然是System.Windows.Controls.StackPanel,我想这很明显,因为 StackPanel 是按钮的实际内容,但就像我说的,我需要知道如何获取只有 TextBlock 的 Text 值,所以在这种情况下 txtBox 应该显示 this is a test!。如何做到这一点?提前感谢!

【问题讨论】:

  • 也许我没有尽我所能解释自己,我不需要只是从随机 TextBlock 中获取文本,我知道这很容易,我需要 TextBlock 中的文本在按钮的 StackPanel 中,想法是通过编程方式创建几个按钮,包括它们的内容,所以当我调用点击事件时,我会得到分配给该特定按钮的任何内容。
  • 按钮是用内部的 StackPanel 创建的,所以它们可以有图像,所以它看起来有点像一个图标,但包含常规按钮的所有事件。

标签: c# wpf xaml button


【解决方案1】:

从我的头顶: 1、在本地存储TextBlock的实例,需要时使用 2. 创建 DependencyProperty 并将其绑定到 TextBlock。在这种情况下,您将始终在此 DP 中拥有最新价值。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    最简单的方法是

    TextBlock txtBlck = new TextBlock();
    txtBlck.Name = "SomeName";
    txtBlck.Text = "this is a test!";
    

    private void test_click(object sender, RoutedEventArgs e)
    {
        txtBox.Text = SomeName.Text;
    }
    

    【讨论】:

      【解决方案3】:

      按钮内容是你的堆栈面板而不是你的文本块,然后有你需要替换的文本块内容:

      txtBox.Text = (发送者为按钮).Content;

      通过这个

      txtBox.Text = txtBlck.Text;
      

      【讨论】:

        【解决方案4】:

        如果你真的想要 textblock 中的文本,那么你不要公开 textblock 并使用它。

        public TextBlock txtBlck = new TextBlock();
                public MainWindow()
                {
                    InitializeComponent();
        
        
                    StackPanel stackPnl = new StackPanel();
                    stackPnl.Orientation = Orientation.Vertical;
                    stackPnl.Margin = new Thickness(10);
        
        
                    txtBlck.Text = "this is a test!";
                    stackPnl.Children.Add(txtBlck);
        
                    Button btn = new Button();
                    btn.Content = stackPnl;
                    btn.Click +=btn_Click;
                    myPanel.Children.Add(btn);
                }
        
                void btn_Click(object sender, RoutedEventArgs e)
                {
                    txtBox.Text = txtBlck.Text;
                }
        

        【讨论】:

        • 是的,这行得通。如果你只是把它从主方法移到主类
        • 不管你有多少控件,这将保留最后一个值直到程序关闭,或者如果你不想这样做,那么最好使用属性来实现这一点。
        猜你喜欢
        • 1970-01-01
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 2022-01-02
        • 2017-10-06
        • 1970-01-01
        相关资源
        最近更新 更多