2014-04-11 4 views
0

내 WPF C# 프로젝트에서 TreeView를 만들었습니다. 각 TreeViewItem에는 항목이 포커스를 잃을 때 발생해야하는 LostFocus 이벤트가 있습니다. 사용자가 특정 TreeViewItem의 헤더를 변경하려고 할 때 클릭해야하는 버튼도 생성했습니다. 사용자는 TreeView에서 선택한 후 단추를 클릭하고 TextBox가 TreeViewItem 헤더를 대체하는 것처럼 보입니다. 사용자가 TextBox를 클릭했지만 다른 TreeViewItem을 클릭하지 않으면 LostFocus 이벤트가 발생하지 않습니다. 그렇지 않으면 사용자가 TextBox를 클릭하고 포커스를 변경하면 해당 텍스트가 올려집니다. textBox.Focus()Keyboard.Focus(textBox)도 사용했지만 작동하지 않습니다. 어떻게 해결할 수 있습니까? 또 다른 SO 여기LostFocus가 TreeViewItem에 대해 생성되지 않았습니다.

here

private void RenameButton_Click(object sender, RoutedEventArgs e) 
    { 

     TreeViewItem twItemSelected = (TreeViewItem)this.Treeview_PropertyDefinition.SelectedItem;                
     var textBox = new TextBox() 
     { 
      Text = (String)twItemSelected.Header, 
     }; 
     textBox.Focus(); 
     Keyboard.Focus(textBox); 
     if (textBox.IsFocused) 
      MessageBox.Show("focused"); 


     twItemSelected.Header = textBox;    


     //check which property is currently selected 

      String parentName = ((TreeViewItem)twItemSelected.Parent).Name; 
      ((TreeViewItem)twItemSelected.Parent).Parent).Name; 

      //get values from file 
      //show page based on parent value 
      switch (parentName) 
      { 
       case "RectangleBar_TreeviewItem": 
        textBox.LostFocus += (o, ev) => 
        {...} 
    } 
+1

강력 적절한 뷰 모델을 작성하고 같은 당신이 윈폼과 같은 절차 적 접근 방식보다는 일을하려고하든위한 것입니다 DataTemplates으로 적절한 데이터 바인딩과 WPF의 개념을 사용하는 것이 좋습니다. –

+0

Francesco는 * 특별한 * * 너무 좋아, 불행히도 .. – UIlrvnd

답변

3

용서 내 그렇게 말하는 코드 조각입니다 대답 내가 읽은 게시물을 작성하기 전에

다만, 명확하게,하지만 모든 일반 WPF 사용자가 읽은 사람 귀하의 질문은 아마도 동정의 머리를 흔들었다. WPF의 진정한 "Zen"은 데이터 바인딩, 템플릿 및 트리거를 사용하여 구식 방식이 아닌 동적으로 UI를 만들 수 있다는 사실을 알지 못해 슬프다는 것을 느낍니다. 이 기능으로 인해 WPF가 아름답습니다. 또한 "1000 %"로 쉽게 만듭니다.

TreeViewItem에서 정의한 속성을 기반으로 HeaderTemplate을 대체하기 위해 TreeViewItem의 트리거를 사용하도록 UI를 변경하는 것이 좋습니다. 항목을 두 번 클릭하면이 속성을 true로 설정합니다. IsKeyboardFocusWithin이 false가되면 false로 설정하십시오 (메타 데이터를 재정의하고 이에 대한 PropertyChangedCallback을 추가 할 수 있음).

귀하의 LostFocus 문제가 발생하는 한, 귀하의 문제는 귀하가 여러 가지 초점 범위를 가졌다 고 생각됩니다. 이것을 "WPF 방법"여기

일에

추가 세부 사항은 연결된 속성, 트리거 및 템플릿을 사용하여이를 구현하는 방법에 대한 세부 사항의 일부입니다.

템플릿은 원하는만큼 간단하거나 복잡 할 수 있습니다. 다음은 간단합니다

여기
<DataTemplate x:Key="NormalTemplate"> 
    <ContentPresenter /> 
</DataTemplate> 

<DataTemplate x:Key="TextBoxTemplate"> 
    <TextBox Text="{Binding}" /> 
</DataTemplate> 

당신의 스타일은 다음과 같은 형태가 될 것이다

은 "propa"조각을 사용하여 MyWindowClass에서 생성 할 수있는 연결된 속성 "ShowTextBox"- 바로 입력 " propa "및 히트 탭을 클릭 한 다음 빈칸을 채우십시오.

그냥 텍스트 상자를 표시 할 항목을 전환하려면 :

SetShowTextBox(item, true); 
To switch it back: 

SetShowTextBox(item, false); 

패턴과 당신이 달성하고자하는 것을 쉽게 할 수 있습니다 그래서 WPF의 관행 학습과 투자를 시도하십시오.

TreeViews로 달성하고자하는 것을 시작할 수있는 프로젝트가 있습니다.

Sample project

+0

사용자는 작년부터 때때로 WPF 대화방을 방문해 왔으며 여러 번 비슷한 조언을 받았습니다. 답변을 주셔서 감사합니다. 너의 희망을 위로^- ^. – UIlrvnd

+0

Stefan,이 시간 동안 당신의 모든 도움에 감사드립니다 ... 저는 새로운 것을 배우는 것이 얼마나 힘든지 알고 있습니다. 특히 WinForms에서 WPF로 관점을 완전히 바꾸어야 할 때 ... 배울 때 너무 나빠요 ...하지만 사람들을 판단하는 것이 옳지 않다고 생각합니다. 그렇죠? – FrancescoDS