2016-09-28 2 views
0

내 응용 프로그램에는 개체에 대한 몇 가지 구성을 나타내는 Usercontrol이 있습니다. 내부에는 상기 객체의 이름을 포함하는 Texblock이 있습니다. 이 Textblock을 클릭하여 텍스트 상자로 바꿔서 이름을 편집 할 수 있기를 원했습니다.텍스트 상자를 클릭 할 때 텍스트 상자의 바인딩을 업데이트하는 방법

가 나는

  1. 그것이
  2. 표시되었을 때에
  3. 이득 키보드 포커스를 누르면 입력 뷰 모델의 값을 설정합니다 다음과 같은 3 개 행동을 할 뷰 모델의 값을 설정 할 때 마우스를 텍스트 상자 외부를 클릭 (콤보가하는 것처럼)

3. 가 어떻게 내 텍스트 상자가 REQ를 충족하기 위해 얻을 수에 나는 현재 붙어 uirement 3 - 텍스트 상자를 클릭하면 값이 설정됩니다. 다른 첨부 파일 동작을 구현하기 위해 일부 첨부 파일 동작을 구현했지만 마우스를 작동시키지 못합니다.

나는 시도 다음 가 이

  • 추가 PreviewMouseDown 이벤트

      -이 내용은 마우스 다운 텍스트 상자도 UserControl을에서
    1. 추가 PreviewMouseDown에있을 때 감지받을 것으로 보인다는 -이 경우에도 맞고 보인다 텍스트 상자가 클릭됩니다. 또한 그것은 내 윈도우 안에 유일한 usercontrol되지 않습니다 그래서 그것은 더 큰 규모로 작동하지 않습니다.
    2. PreviewMouseDownOutsideCapturedElement를 추가했으나 발사 할 수 없습니다. 모두 UpdateSourceTrigger과 이벤트로 초점을 잃어버린
    3. 은 - 당신이 다른 입력 필드를 클릭보다는 다음과 같이 내 텍스트 상자에 대한

    코드를 클릭 할 때 만 작동합니다.

      <TextBox x:Name="text" VerticalAlignment="Center" 
           Margin="5,2,0,0" 
           Text="{Binding Name, Mode=TwoWay}" 
           Visibility="{Binding IsEditingName, Converter={StaticResource VisConverter}, FallbackValue=Collapsed}" 
           b:FocusBehaviours.ShouldFocusWhenVisible="True" 
           b:InputBehaviours.UpdatePropertySourceWhenEnterPressed="TextBox.Text"/> 
    

    가 나는 수많은 SO 게시물에서 검토 한 결과 그들 중 누구도 그들 모두가 내가 할 수없는 창/UserControl을에 추가 추천이 나를 도울 수있을 것 같다.

  • +4

    'UpdateSourceTrigger'를'LostFocus '로 설정하는 방법은 무엇입니까? – Pikoh

    +0

    @ Pikoh 다른 텍스트 상자 또는 콤보 상자를 클릭하기보다는 클릭하는 경우에만 작동합니다. LostFocus가 Binding과 Event 모두에서 의미하는 바는 내가 쓰고있을 때 정확한 이름을 기억하지 못했기 때문에 더 명확하게 편집 할 것입니다. 감사합니다 – Keithin8a

    +0

    좋아, 그래서 당신이 다른 컨트롤 에서뿐만 아니라, 내가 맞습니까 사용자 컨트롤에서 아무 곳이나 클릭하면 의미합니까? 그렇다면 왜 사용자 컨트롤을 포커스 할 수있게 만드시겠습니까? 나는 그것이 더 쉬운 방법이라고 생각한다 ... – Pikoh

    답변

    0

    해결책을 찾을 수있었습니다.

    기본적으로 텍스트 상자의 OnGotFocus에 대한 내 코드에서 이벤트를 바인딩했습니다. 이 메서드를 실행하면 MouseDown 및 MouseLeave에 대한 이벤트가 usercontrol에 추가됩니다. 따라서 사용자 정의 컨트롤의 아무 곳이나 클릭하면 텍스트 상자의 내용이 업데이트됩니다.

    사용자 정의 컨트롤의 경계를 벗어나면 마우스 다운 이벤트를 창 자체로 옮기고 싶습니다. 비슷하게 사용자 콘트롤로 돌아 가면 윈도우에서 마우스 다운 이벤트를 제거하기를 원할 것입니다. 그렇지 않으면 떠난 후에 다시 텍스트 상자를 클릭 할 때 값을 설정합니다.

    본인이 여기에 제 코드를 추가 했으므로 누구나 비슷한 문제가있을 수 있음을 분명히 알 수 있습니다.

    내가 코드를 사용하는 것보다 더 나은 방법이 있어야한다고 확신하지만 여기서는 MVVM 원칙을 위반한다고 생각하지 않습니다. 그래서 나는 안전하다고 생각합니다.

     private void View_OnMouseDown(object sender, MouseButtonEventArgs e) 
        { 
         updateTextbox(); 
        } 
    
        private void View_OnMouseLeave(object sender, MouseEventArgs e) 
        { 
         Window parentWindow = Window.GetWindow(this); 
    
         if (parentWindow != null) 
         { 
          Mouse.AddPreviewMouseDownHandler(parentWindow, ParentWindow_OnMouseDown); 
         } 
        } 
    
        private void View_OnMouseEnter(object sender, MouseEventArgs e) 
        { 
         Window parentWindow = Window.GetWindow(this); 
    
         if (parentWindow != null) 
         { 
          Mouse.RemovePreviewMouseDownHandler(parentWindow, ParentWindow_OnMouseDown); 
         } 
        } 
    
        private void ParentWindow_OnMouseDown(object sender, MouseButtonEventArgs mouseButtonEventArgs) 
        { 
         Window parentWindow = Window.GetWindow(this); 
    
         if (parentWindow != null) 
         { 
          Mouse.RemovePreviewMouseDownHandler(parentWindow, ParentWindow_OnMouseDown); 
         } 
         updateTextbox(); 
        } 
    
        private void updateTextbox() 
        { 
         Keyboard.Focus(this); 
        } 
    
        private void Text_OnGotFocus(object sender, RoutedEventArgs e) 
        { 
         MouseDown += View_OnMouseDown; 
         MouseLeave += View_OnMouseLeave; 
         MouseEnter += View_OnMouseEnter; 
        } 
    
        private void Text_OnLostFocus(object sender, RoutedEventArgs e) 
        { 
         BindingOperations.GetBindingExpression(text, TextBox.TextProperty).UpdateSource(); 
         MouseDown -= View_OnMouseDown; 
         MouseLeave -= View_OnMouseLeave; 
         MouseEnter -= View_OnMouseEnter; 
    
        } 
    
    관련 문제