2016-07-18 7 views
1

이 질문을하는 방법에 대해서는 조금 확신이 없습니다.
업데이트 코드 샘플이 포함되었습니다.UWP - TextBlock.Text가 이벤트별로 변경된 매 시간 값을 업데이트하지 않습니다.

'재미있는'UWP 애플리케이션을 구축하고 있습니다. 컬렉션의 각 항목에 대해 작업을 수행하는 사용자 시작 작업이 있습니다. 이 상황이 진행됨에 따라 사용자에게 계속 진행 상황을 알리고 싶습니다.

과거에 (Winforms) 나를 위해 일한 접근 방식은 항목을 처리 할 때마다 이벤트를 시작하고 텍스트 상자의 텍스트를 업데이트하는 것입니다. 내 UWP 코드는 앞의 동작이 아닌 마지막 동작의 '상태'만 표시한다는 점을 제외하고는 정상적으로 작동합니다.

질문 :이게 완전히 잘못된 것입니까? 내가 사용했던 또 다른 방법은 논리의 '상태'속성을 업데이트하고, UI 실행하는 것입니다, 참고

(나는 내가 할 경우, 때 .refresh()는 1990 년 조금 보인다 놀랄 것) 현재 상태에 대한 논리를 폴링하는 타이머 (즉, 논리 내부의 이벤트가 아닌 특정 시점에 상태를 표시). 난 아직 어떤 UWP 애플 리케이션에서 이것을 시도 할 시간이 없었어요.

나는이 두 번째 방법이 '더 좋다'는 말을하게되어 기쁩니다. 그러나 첫 번째 방법이 왜 효과가 없는지에 대해 더 자세히 이해하고 싶습니다.

첫째 거기에 무거운 리프팅 핸들이 클래스 :

public class Enigma1Device : IEnigmaDevice 
{ 
    public event CharacterEnciphered OnCharacterEnciphered; 

    public string TypeMessage(string message) 
    { 
     StringBuilder output = new StringBuilder(); 
     char[] chars = message.ToCharArray(); 
     char temp; 

     if (OnCharacterEnciphered != null) 
     { 
      for (int c = 0; c < chars.Length; c++) 
      { 
       if (ValidInput(chars[c])) 
       { 
        temp = ProcessLetter(chars[c], c + 1); 
        output.Append(temp); 
        OnCharacterEnciphered(temp); 
       } 
      } 
     } 
     else 
     { 
      ... 
     } 

     return output.ToString(); 
    } 
} 

그리고이 호출하는 XAML 페이지 :

public sealed partial class Enigma1Page : Page 
{ 
    public Enigma1Device EnigmaDevice; 

    private void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     EnigmaDevice = new Enigma1Device(); 
     EnigmaDevice.OnCharacterEnciphered += EnigmaDevice_OnCharacterEnciphered; 
    } 

    private void stdEnigmaKeyboard_OnHereIsSomeTextToEncipher(string plaintext) 
    { 
     txtOutput.Text = EnigmaDevice.TypeMessage(plaintext); 
    } 

    private void EnigmaDevice_OnCharacterEnciphered(char l) 
    { 
     txtStatus.Text = l.ToString(); 
    } 
} 
+0

우리는 당신이 무엇을했는지에 대한 코드를 보여주지 않고는 도움을 줄 수 없습니다. [mvce] (http://stackoverflow.com/help/mcve). 또한 알아 두어야 할 중요한 점은 바인딩이나 무결성 코드 (mvvm) 뒤에 일반 코드를 사용하는 경우입니다. – Bart

+0

Ehhh 코드가 없으면 올바르게 접근하고 있는지 알려줄 수 있습니다. –

+0

예, 약간 헛소리였습니다. 일부 코드가 제공됩니다. –

답변

1

것은 나는이 완전히 잘못된 접근, 또는 내가 필요로 할 건가요 textbox.Refresh()와 동등한 작업을 수행 하시겠습니까? 당신은 값이 변경 TextBlock.Text마다 업데이트해야하는 경우

아 ... 아니, 우리는 데이터 바인딩을 사용하는 것이 좋습니다

(나는 내가 할 경우, 때 .refresh()는 1990 년 조금 보인다 놀랄 것) INotifyPropertyChanged interface의 구현이 포함됩니다. 검색 할 수있는 샘플이 많이 있습니다.

나는 컬렉션의 각 항목에 대해 작업을 수행하는 사용자 시작 작업이 있습니다. 이 상황이 진행됨에 따라 사용자에게 계속 진행 상황을 알리고 싶습니다.

난 당신 게시 된 코드 중 하나를 찾을 수 없습니다

이 컬렉션에 관련되어, 난 그냥 당신이 실제로이 컬렉션의 모든 항목을 표시 ListView or GridView을 사용하는 경우 궁금해하고, 각 ListViewItemTextBlock의 텍스트를 변경하려면/GridViewItem. 그렇다면 공식 ListView and GridView sample을 참조하여 컬렉션 및 데이터 바인딩에서 어떻게 작동하는지 확인할 수 있습니다.

어떤 방식 으로든 UWP에서 Data binding이 필요합니다. 달성하고자하는 것이 확실하지 않기 때문에 여기에 데모를 작성하지 않았으며, 문제가 있으면 의견을 남길 수 있습니다.

그런데, "내 UWP 코드는 작동합니다. 단, 앞의 동작이 아니라 마지막 동작의 '상태'만 표시된다는 점만 다릅니다."

+0

감사. BTW, 'collection'은 Enigma1Device.TypeMessage()의 char 배열입니다. 일반적인 의미에서 컬렉션을 의미했습니다. –

+0

마지막 문장/질문에 대한 답변에서 배열을 반복 할 때 stdEnigmaKeyboard_OnHereIsSomeTextToEncipher()는 이전에 처리 된 문자가 아닌 처리 할 마지막 문자 만 표시합니다. '오'하지만 절대로 h, e, l, l. –

+0

@ AdrianK, 각 암호화 된 문자의 진행 상황을 표시 하시겠습니까? 왜? 나는 각 캐릭터의 진행이 매우 빠른 액션이 될 수 있다고 생각한다. 나는 개인적으로 암호화 된 전체 문자열을 출력하기 위해'StringBuilder'를 사용하는 두 번째 메소드를 선호한다. –