문제

내 WPF C# 프로젝트에서 TreeView를 만들었습니다.각 TreeViewItem에는 항목이 포커스를 잃었을 때 발생해야 하는 LostFocus 이벤트가 있습니다.또한 사용자가 특정 TreeViewItem의 헤더를 변경하려고 할 때 클릭해야 하는 버튼도 만들었습니다.사용자는 TreeView에서 선택한 후 버튼을 클릭할 수 있으며 TreeViewItem 헤더를 대체하는 TextBox가 나타납니다.사용자가 TextBox를 클릭하지 않고 다른 TreeViewItem을 클릭하면 LostFocus 이벤트가 발생하지 않습니다.그렇지 않은 경우 사용자가 TextBox를 클릭한 다음 포커스를 변경하면 해당 텍스트가 발생합니다.나는 또한 사용했다 textBox.Focus() 그리고 Keyboard.Focus(textBox) 하지만 작동하지 않습니다.이 문제를 어떻게 해결할 수 있나요?

분명히 말하면 게시물을 작성하기 전에 또 다른 SO 답변을 읽었습니다. 여기

다음은 스니펫 코드입니다.

 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) =>
                     {...}  
    }
도움이 되었습니까?

해결책

죄송합니다. 하지만 귀하의 질문을 읽은 모든 일반 WPF 사용자는 아마도 동정심에 고개를 저었을 것입니다.구식 방식이 아닌 데이터 바인딩, 템플릿 및 트리거를 활용하여 UI를 동적으로 만드는 진정한 "WPF의 Zen"을 아직 배우지 않았기 때문에 안타깝습니다.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>

귀하의 스타일은 다음과 같습니다.

첨부된 속성 "ShowTextBox"는 "propa" 스니펫을 사용하여 MyWindowClass에서 생성할 수 있습니다. "propa"를 입력하고 탭을 누른 다음 공백을 채우면 됩니다.

텍스트 상자를 표시하도록 항목을 전환하려면 다음을 수행하십시오.

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

SetShowTextBox(item, false);

의 패턴과 실천을 배우고 투자해 보세요. WPF 그래서 당신이 달성하고 싶은 것을 쉽게 할 수 있습니다.

TreeViews를 사용하여 달성하려는 작업을 시작하는 데 도움이 되는 프로젝트도 있습니다.

샘플 프로젝트

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top