문제

나는 중첩이있다 TreeView 여기서 노드의 텍스트가 편집 가능한 텍스트 상자로 변경되도록 각 항목의 DoubleClick 이벤트를 바인딩합니다. 그런 다음 LostFocus Eventhandler를 사용하여 TextBox를 제거하고 텍스트를 복원합니다.

  void treeViewItemWithMenu_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (selected == e.Source)
        {
            TextBox tb = new TextBox();
            tb.Text = this.Header.ToString();
            tb.Focus();
            tb.LostFocus += new RoutedEventHandler(tb_LostFocus);
            this.Header = tb;
            var a = e.OriginalSource;
            e.Handled = true;
        }
    }


    void tb_LostFocus(object sender, RoutedEventArgs e)
    {
        this.Header = ((TextBox)(this.Header)).Text;
    }

불편하게 LostFocus 이벤트가 올바르게 작동하는 것처럼 보이지 않습니다. 텍스트 상자 밖에서 클릭하면 전혀 발사되지 않습니다. 다른 노드에서 더블 클릭 할 수도 있고 편집 모드 (즉, 텍스트 상자가됩니다)로 이동하는 반면 첫 번째 텍스트 상자에는 여전히 초점이있는 것 같습니다. 내가 두 개의 텍스트 상자 사이를 오가는 시작될 때까지 초점을 잃지 않습니다.

프로젝트가 .NET 3.5로 설정된 VS2010 RC를 사용하고 있습니다.

도움이 되었습니까?

해결책

어머! 내 말을 용서하지만, 당신의 질문을 읽은 모든 일반 WPF 사용자는 아마도 동정심으로 머리를 흔들었을 것입니다. 데이터 바인딩, 템플릿 및 트리거를 활용하여 구식 방식으로 수행하기보다는 UI를 역동적으로 만드는 진정한 "Zen of WPF"를 아직 배우지 못했기 때문에 슬퍼합니다. WPF는이 능력 때문에 아름답습니다. 또한 "1000%"를 더 쉽게 만듭니다.

TreeViewItem의 트리거를 사용하여 TreeViewItem에서 정의하는 속성을 기준으로 HeaderTemplate을 교체하려면 UI를 변경하는 것이 좋습니다. 항목을 두 번 클릭 할 때이 속성을 참조하십시오. iskeyboardfocuswithin이 false가 될 때 false를 설정하십시오 (메타 데이터를 무시하고 propertyChangedCallback을 추가 할 수 있습니다).

LostFocus 문제가 진행되는 한, 귀하의 문제는 여러 번의 초점 범위를 가지고 있거나 RC의 버그라고 생각합니다. 당신의 XAML을 보지 않고 나는 그 이상을 말할 수 없습니다.

이 작업에 대한 추가 세부 사항 "WPF Way"

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

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

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

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

다음은 다음과 같습니다. 스타일은 다음과 같습니다.

<Style TargetType="TreeViewItem">
  <Setter Property="HeaderTemplate" Value="{StaticResource NormalTemplate}" />
  <Trigger Property="local:MyWindowClass.ShowTextBox" Value="true">
    <Setter Property="HeaderTemplate" Value="{StaticResource TextBoxTemplate}" />
  </Trigger>
</Style>

첨부 된 속성 "ShowTextBox"는 "Propa"스 니펫을 사용하여 MyWindowClass에서 작성할 수 있습니다. "Propa"를 입력하고 탭 탭을 입력 한 다음 공백을 채 웁니다.

텍스트 상자를 표시하기 위해 항목을 전환하려면 다음과 같습니다.

SetShowTextBox(item, true);

다시 전환하려면 :

SetShowTextBox(item, false);

이게 도움이 되길 바란다.

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