2010-08-24 1 views
0

WPF에 관한 간단한 질문 : Canvas/Grid 내에서 하위 요소를 선택하려면 어떻게합니까? 다음 XAML에서 예를 들어WPF : 캔버스 내에서 자식 컨트롤 선택

는 니펫을 :

<Canvas Name="parentCanvas" Width="200" Height="200" Background="AliceBlue" MouseMove="parentCanvas_MouseMove" MouseLeave="parentCanvas_MouseLeave"> 
     <Border Name="border1" Margin="10" Height="100" Width="180" Background="Maroon" Canvas.Top="47" /> 
    </Canvas> 

가 ... 어떻게 parentCanvas_MouseMoveparentCanvas_MouseLeave 방법에서 border1 액세스 할 수 있습니까? 또는 액세스하는 올바른 방법이 더 많이 있다는 것이다

private void parentCanvas_MouseLeave(object sender, MouseEventArgs e) 
    { 
     Canvas c = (Canvas)sender; 
     c.Background = Brushes.Blue; 
    } 

:

또한, 나는이 이벤트 핸들러 내에서 캔버스 자체를 액세스하는 방법은 내가의 라인을 따라 뭔가를 조금 해키 보인다 이것을하는 우아한 방법?

많은 감사,
함자. 당신이 Name 속성을 가진 컨트롤의 이름을 때

답변

4

, 그것은 클래스의 멤버를 생성합니다, 그래서 당신은 이름에 액세스 할 수 있어야합니다 : 컨트롤이의 ControlTemplate의 일부인 경우

private void parentCanvas_MouseLeave(object sender, MouseEventArgs e) 
{ 
    Canvas c = parentCanvas; 
    c.Background = Brushes.Blue; 
    Border b = border1; 
} 

또는 DataTemplate을 사용하는 경우 부모에 대한 참조를 가져와 템플릿에서 찾아야합니다. 당신의 XAML은 DataTemplate을의 일부인 경우 예를 들어, 같은 것을해야 할 것 : 완벽하게 합리적이다 적절한 유형에 sender 매개 변수를 캐스팅, 어떤 경우

private void parentCanvas_MouseLeave(object sender, MouseEventArgs e) 
{ 
    Canvas c = (Canvas)sender; 
    var contentPresenter = (ContentPresenter)c.TemplatedParent; 
    var b = contentPresenter.ContentTemplate.FindName(
     "border1", contentPresenter); 
} 

을, 그리고 당신이 할 수 귀하 이벤트 처리기를 더 재사용 할 수 있습니다. 당신이 당신의 캔버스의 이름이없는 경우


은 또한 시각적 아이들을 반복하는 캔버스의 Children 속성을 사용할 수 있습니다 :

private void parentCanvas_MouseLeave(object sender, MouseEventArgs e) 
{ 
    Canvas c = (Canvas)sender; 
    var firstChild = c.Children[0]; 
    var firstBorderChild = c.Children.OfType<Border>().FirstOrDefault(); 
} 

을 마지막으로, 당신은 시각이있는 경우 그 패널하지, 당신은 VisualTreeHelper.GetChildrenCountVisualTreeHelper.GetChild를 사용할 수 있습니다

for (int childIndex = 0; 
    childIndex < VisualTreeHelper.GetChildrenCount(c); 
    childIndex++) 
{ 
    var child = VisualTreeHelper.GetChild(c, childIndex); 
} 
+0

감사 대답 Quartermeister을 위해 실제로 작동하는지. 당신의 후속 질문은 괜찮습니다 ... 만약이 이벤트 핸들러를 여러 캔버스 요소와 공유하거나 컨트롤에'Name' 속성이 없다면 어떻게 이것을 할 수 있습니까? 감사. – Hamza

+0

@Hamza : Canvas의 Children 속성을 사용하거나 VisualTreeHelper의 메서드를 사용하여 다른 시각적 효과를 얻을 수 있습니다. 내 업데이트 답변을 참조하십시오. – Quartermeister

+0

나는 그것을 지금 생각한다. 매우 명확히 설명해 주셔서 감사합니다. :) – Hamza