Canvas control Findname return null

XAML

<Window x:Class="Ahihi.Window1"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	Title="Ahihi" Height="300" Width="300"
	>
	<Grid>
		<Canvas Name="Mega"></Canvas>
	</Grid>
</Window>

C# code

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
namespace Ahihi
{
	/// <summary>
	/// Interaction logic for Window1.xaml
	/// </summary>
	public partial class Window1 : Window
	{
		public Window1()
		{
			InitializeComponent();
			Mega.Children.Add(new Border(){Name="linh"});
			((Border)(Mega.FindName("linh"))).Background=Brushes.Red;
		}
	}
}

Em không hiểu tại sao mà đoạn code ((Border)(Mega.FindName("linh"))) nó return NULL? Em loay hoay mãi mà không được T_T. Mấy bác giúp em với!

FindName operates within the current element’s namescope

Chẳng biết phải dịch như thế nào
Nếu element được thêm sau khi initialization thì phải gọi thêm method RegisterName
Tham khảo đoạn code viết lại:

    Border border = new Border() { Name = "linh" };
    Mega.Children.Add(border);
    RegisterName("linh", border);
    ((Border)(Mega.FindName("linh"))).Background = Brushes.Red;

Thực sự thì không nên viết theo cách này. Bạn nên tìm cách tiếp cận khác.
VD

    Border border = new Border() { Name = "linh" };
    border .Background  = Brushes.Red;
    Mega.Children.Add(border);

hoặc:

    Mega.Children.Add(new Border() {
                 Name = "linh" ,
                 Background = Brushes.Red });
1 Like

Em chỉ tò mò hôm bữa sao em dùng findname được mà hôm nay em lại không dùng được :sweat_smile: chứ nếu như thực sự cần viết 1 đoạn code có chức năng như trên thì em sẽ chọn cách của bác :smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?